トップページ > 過去ログ > 記事閲覧
HBITMAPを描画(再興)
名前:埴輪 日時: 2012/02/16 00:46

以前、http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=2068 で教えていただいたことなどを元に、下記のソースで、スクリーンショットの 画像ハンドル(LoadGraphでそのまま描画できる形式)が作成できそうだと 思ったのですが、うまくいきません。 また、backの値は0ではなく、shを返させてみてDrawSoftImageも試しましたが 共に表示されませんでした。 特にGetScreenShotの方が怪しそうなので、間違っているところの ご指摘をよろしくお願いします。 int back=GetScreenShot(800,600); DrawGraph(0,0,back,false); int GetScreenShot(int _width,int _height) { HDC hdc_wnd=GetDC(NULL); HBITMAP bitmap=CreateCompatibleBitmap(hdc_wnd,_width,_height); HDC hdc_bmp=CreateCompatibleDC(hdc_wnd); /// ハンドルにビットマップを設定 SelectObject(hdc_bmp, bitmap); /// スクリーンをビットマップに描画 BitBlt(hdc_bmp, 0, 0, _width, _height, hdc_wnd, 0,0, SRCCOPY); int retval=ConvertGraph(bitmap); DeleteDC(hdc_bmp); DeleteObject(bitmap); ReleaseDC(NULL,hdc_wnd); return retval; } int ConvertGraph(HBITMAP hBmp) { // DIBセクションの取得 BITMAP DDBInfo; BITMAPINFO DIBInfo; GetObject( hBmp, sizeof(BITMAP), &DDBInfo ); DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); DIBInfo.bmiHeader.biWidth = DDBInfo.bmWidth; DIBInfo.bmiHeader.biHeight = DDBInfo.bmHeight; DIBInfo.bmiHeader.biPlanes = 1; DIBInfo.bmiHeader.biBitCount = 32; DIBInfo.bmiHeader.biCompression = BI_RGB; BYTE *pData = new BYTE[DDBInfo.bmWidth * DDBInfo.bmHeight * 4]; HDC hDC = GetDC(NULL); GetDIBits( hDC, hBmp, 0, DDBInfo.bmHeight, (void*)pData, &DIBInfo, DIB_RGB_COLORS); ReleaseDC(NULL, hDC ); DeleteObject( hBmp ); // ソフトイメージに変換してみる int sh = MakeXRGB8ColorSoftImage( DDBInfo.bmWidth, DDBInfo.bmHeight ); BYTE *Dots = pData; for ( int y = DDBInfo.bmHeight - 1; y >= 0 ; y-- ) { // データは上下さかさまらしい for ( int x = 0; x < DDBInfo.bmWidth; x++ ) { DrawPixelSoftImage( sh, x, y, *(Dots+2), *(Dots+1), *(Dots+0), *(Dots+3) ); Dots += 4; } } // ハンドルに変換してみる int gh = CreateGraphFromBmp( &DIBInfo, pData ); // やってみたらうまくいきました。 delete pData; // ReCreateGraphするときに必要かも。 return gh; } 追記:ヘッダに int BltBmpToGraph( COLORDATA *SrcColor, HBITMAP Bmp, HBITMAP AlphaMask,int CopyPointX, int CopyPointY, int GrHandle) ; 画像データの転送 というのを見つけました。 試してみて使い方がよくわからなかったですが、これは使えないですか?

Page: 1 |

Re: HBITMAPを描画(再興) ( No.1 )
名前:いっち 日時:2012/02/16 21:03

私の環境では以下のコードでスクリーンショットを画面に表示することが出来ました。 //- 以下、テストコード -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); int _width = 640, _height = 480; HDC hdc_wnd = GetDC( NULL ); HBITMAP bitmap = CreateCompatibleBitmap( hdc_wnd, _width, _height ); HDC hdc_bmp = CreateCompatibleDC( hdc_wnd ); SelectObject( hdc_bmp, bitmap ); BitBlt( hdc_bmp, 0, 0, _width, _height, hdc_wnd, 0, 0, SRCCOPY ); BITMAP DDBInfo; BITMAPINFO DIBInfo; GetObject( bitmap, sizeof(BITMAP), &DDBInfo ); DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); DIBInfo.bmiHeader.biWidth = DDBInfo.bmWidth; DIBInfo.bmiHeader.biHeight = DDBInfo.bmHeight; DIBInfo.bmiHeader.biPlanes = 1; DIBInfo.bmiHeader.biBitCount = 32; DIBInfo.bmiHeader.biCompression = BI_RGB; BYTE *pData = new BYTE[DDBInfo.bmWidth * DDBInfo.bmHeight * 4]; HDC hDC = GetDC(NULL); GetDIBits( hDC, bitmap, 0, DDBInfo.bmHeight, (void*)pData, &DIBInfo, DIB_RGB_COLORS); ReleaseDC( NULL, hDC ); int gh = CreateGraphFromBmp( &DIBInfo, pData ); delete pData; DeleteDC(hdc_bmp); DeleteObject(bitmap); ReleaseDC(NULL,hdc_wnd); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST" ); DrawGraph( 0, 0, gh, TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: HBITMAPを描画(再興) ( No.2 )
名前:埴輪 日時:2012/02/17 00:28

ありがとうございます。 どうやらうまくいかなかった原因のもう一つは Dxlib_Init()ですでに真っ黒になった画面を撮影していたというのもあったと思いました。
Re: HBITMAPを描画(再興) ( No.3 )
名前:埴輪(解決) 日時:2012/02/17 00:29

解決フラグを立て忘れていました。 重ねて、ありがとうございました。

Page: 1 |