HBITMAP в JPEG / PNG без CImage в переполнении стека

У меня есть HBITMAP, который я хочу сохранить в поток JPEG / PNG или массив байтов. Проблема в том, что я использую mingw в качестве компилятора, поэтому я не могу использовать CImage … что сделало бы мою жизнь проще.

Я могу получить пиксели из растрового изображения без каких-либо проблем, но я не знаю, как получить к ним доступ в формате JPEG / PNG.

С чего мне начать?

2

Решение

Если у вас есть доступ к библиотеке DirectX, вы можете использовать IStream для конвертации изображения в JPEG
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380034(v=vs.85).aspx

или если у вас есть GDI + что-то вроде этого может работать

Gdiplus::Bitmap bmp(hbmpImage,(HPALETTE)0);
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bmp.Save(L"D:\image.png",&pngClsid,NULL);

GetEncoderLCLsid выглядит следующим образом
int GetEncoderClsid (постоянный формат WCHAR *, CLSID * pClsid)
{
UINT num = 0; // количество кодировщиков изображений
Размер UINT = 0; // размер массива кодировщика изображения в байтах

   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
}

не забудьте инициализировать GDI +

 GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

если у вас нет доступа к ним, вы можете использовать libjpeg, но вам нужно поместить все пакеты зависимостей с сайта GnuWin32. Гораздо быстрее должен работать код на этой странице, просто забудьте о повышении

libjpeg умирает без сообщения

1

Другие решения

Другой вариант заключается в использовании WIC API (Windows Imaging Component), который дает прямой доступ к кодировщикам и декодерам изображений. Я считаю, что GDI + может использовать это под прикрытием.

0

По вопросам рекламы [email protected]