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