Ошибка состояния Image.save 2, неверный параметр.Но, похоже, нет, - PullRequest
0 голосов
/ 01 февраля 2019

Итак, я пытаюсь загрузить файл BMP и сохранить его в PNG, достаточно просто.

У меня готов файл BMP, который открывается нормально, и называется «input.bmp».Используя GDI +, я загрузил изображение с помощью

Gdiplus::Image* image = Gdiplus::Image::FromFile(L"input.bmp");

, получил код кодера

int result = GetEncoderClsid(L"image/png", &encoderClsid);

и сохранил его в формате png.

stat = image->Save(L"output.png", &encoderClsid);

и сохраняем «stat»дает 2, который должен быть недопустимым параметром.И не создает никаких файлов PNG.

Имена файлов фиксируются в input.bmp и output.png, поскольку я не обрабатываю несколько изображений одновременно.Когда у меня есть изображение, готовое для преобразования, я просто вызываю функцию BMP2PNG.

У кого-нибудь есть идеи?мне это кажется чертовски похоже на документацию MSDN и реализацию других людей ...

вот полный код

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    ImageCodecInfo* pImageCodecInfo = NULL;

    GetImageEncodersSize(&num, &size);
    if (size == 0)
        return -1;  // Failure

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if (pImageCodecInfo == NULL)
        return -1;  // Failure

    GetImageEncoders(num, size, pImageCodecInfo);

    for (UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }

    free(pImageCodecInfo);
    return -1;  // Failure
}

int BMP2PNG()
{
    // Initialize GDI+.
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    CLSID   encoderClsid;
    Status  stat;
    Gdiplus::Image* image = Gdiplus::Image::FromFile(L"input.bmp");
    int result = GetEncoderClsid(L"image/png", &encoderClsid);

    if (result == -1)
        printf("GetEncoderClsid Error\n");

    stat = image->Save(L"output.png", &encoderClsid);

    if (stat == Ok)
        printf("output.png was saved successfully\n");
    else
        printf("Failure: stat = %d\n", stat);

    delete image;
    GdiplusShutdown(gdiplusToken);
    return 0;
}

1 Ответ

0 голосов
/ 03 февраля 2019

Ошибка 2 для GetLastStatus обычно указывает на то, что имя файла неверно.Эта ошибка могла возникнуть ранее, поскольку входной файл не существует или является недопустимым файлом растрового изображения.

Обязательно используйте полные пути.Проверьте наличие ошибок при открытии файла.

Gdiplus::Status stat;
Gdiplus::Image* image = Gdiplus::Image::FromFile(L"c:\\fullpath\\input.bmp");
if(!image)
{
    stat = image->GetLastStatus();
    printf("FromFile error %d\n", stat);
}
...