2

JPEG/PNGストリームまたはバイト配列に保存したいHBITMAPがあります。問題は、コンパイラとしてmingwを使用しているため、CImageを使用できないことです。これにより、作業が楽になります。

ビットマップから問題なくピクセルを取得できますが、JPEG/PNG形式でピクセルにアクセスする方法がわかりません。

どこから始めればいいですか?

4

2 に答える 2

1

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(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
}

GDI+ の初期化を忘れないでください

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

どちらにもアクセスできない場合は、libjpeg を使用できますが、GnuWin32 サイトからすべての依存パッケージを配置する必要があります。このページのコードははるかに高速に動作するはずですが、ブーストについては忘れてください

libjpeg がメッセージなしで死ぬ

于 2012-11-25T20:30:26.833 に答える
0

もう 1 つのオプションは、イメージ エンコーダーとデコーダーに直接アクセスできるWIC API (Windows Imaging Component) を使用することです。GDI+ はこれを裏で使用する可能性があると思います。

于 2016-04-19T18:32:22.460 に答える