ホーム » 2015 » 1月 » 14

日別アーカイブ: 2015/01/14

2015年1月
 123
45678910
11121314151617
18192021222324
25262728293031

カテゴリー

アーカイブ

ブログ統計情報

  • 77,430 アクセス



GetDIBits

GetDIBits を利用していて,最初うまく取れなかったのでメモ.


lpvBits に NULL が指定できるとのことなので,
  ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
しかしうまく取れない.原因は,biSize の指定がされてなかったため.
  bmif.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) ;


以下の様に,BITMAPINFO を求めてから,もう一度呼び出し情報は取れる様になった.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], &bmif,DIB_RGB_COLORS) != 0) {
    ….
    }
が,bmif の部分を stack としていて,オーバーフローしている.
  BITMAPINFO bmif ; memset(&bmif, 0, sizeof(BITMAPINFO)) ;
デバッグ用に,次の様に 0xfe で初期化して渡してみると
  v_char bmif ; bmif.resize(sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256,-2) ;
   memset(&bmif[0],0, sizeof(BITMAPINFO)) ;
  BITMAPINFO* pbmi = (BITMAPINFO*)&bmif[0] ;

00036C40  28 00 00 00 02 00 00 00 02 00 00 00 01 00 20 00  (............. .
00036C50  03 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00  ................
00036C60  00 00 00 00 00 00 00 00 00 00 FF 00 00 FF 00 00  ................
00036C70  FF 00 00 00 FE FE FE FE FE FE FE FE FE FE FE FE  ................


どうも,1 回目の GetDIBits で,pbmi->bmiHeader.biCompression が BI_BITFIELDS となっている.
  … the color table consists of three DWORD color masks that specify the red, … とある.
以下の様に,BI_RGB を再設定する様にした.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, pbmi,DIB_RGB_COLORS) ;
    pbmi->bmiHeader.biCompression = BI_RGB ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], pbmi,DIB_RGB_COLORS) != 0) {
    ….
    }
HBM_Fn.hxx
i_DIB_Fn.hxx

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.