Image.save 状态错误 2,参数无效。不过好像没有
Image.save state error 2, invalid parameter. But doesn't seem to have any,
所以我正在尝试加载 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);
和'stat' keep给出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;
}
GetLastStatus
的错误 2 通常表示文件名无效。此错误可能较早发生,因为输入文件不存在或它是无效的位图文件。
确保使用完整路径名。打开文件时检查错误。
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);
}
所以我正在尝试加载 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);
和'stat' keep给出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;
}
GetLastStatus
的错误 2 通常表示文件名无效。此错误可能较早发生,因为输入文件不存在或它是无效的位图文件。
确保使用完整路径名。打开文件时检查错误。
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);
}