Image.save稳态误差2,参数无效。但似乎并没有为已任,

问题描述 投票:1回答:1

所以我试图加载BMP文件并保存为PNG,够简单。

我有BMP文件准备好,打开罚款,并命名为“input.bmp”。使用GDI +,我使用加载的图像

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

并获得编码器ID

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

并将其保存为PNG格式。

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

和“静”守给出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;
}
gdi+
1个回答
1
投票

错误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);
}
© www.soinside.com 2019 - 2024. All rights reserved.