Итак, я пытаюсь загрузить файл 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;
}