• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:imgctl.dllを使って読み込んだ画像ファイルをTransparentBltで画く方法)

imgctl.dllを使って読み込んだ画像ファイルをTransparentBltで画く方法

このQ&Aのポイント
  • BMP画像を読み込んだプログラムを拡張してPNG画像も扱えるようにするためにimgctl.dllを使用しています。しかし、imgctl.dllではHDC(デバイスコンテクストハンドル)を取得することができず、BitBlt()やTransparentBlt()関数が使用できません。
  • 問題1はDIBtoDC()で解決しましたが、問題2であるTransparentBlt()関数の代替方法がわかりません。
  • HDIBからHDCを得る方法や透明色を扱うためのHDIBを使用した関数について教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

HDIBからHBITMAPを取得するなら imgctl.dll付属の『imgctl_util.c』のDIBtoOBJが使えると思いますよ DIBtoOBJは HDCとHDIBを引数にとりますので BeginPaint( hWnd, &ps ); HDC = hdc = ps.hdc; HDIB hJpg = JPGtoDIB( "ファイル名" ); HBAIMAP hBmpJpg = DIBtoOBJ( hdc, hJpg ); といった具合で ビットマップハンドルを取得できるともいます 以下のようにすればJPG,BMP,PNG,GIFからビットマップハンドルを取得できると思います HBITMAP myLoadImage( LPSTR lpFileName ) {   HDIB hDIB = NULL;   HBITMAP hbmp = NULL;   HDC hDC = NULL;   // デスクトップ互換のHDCを取得   hDC = GetDC( NULL );   // 拡張子別に HDIB作成を場合分けする   if ( strstr(lpFileName, ".jpg" ) != NULL ) {     hDIB = JPGtoDIB( lpFileName );   } else if ( strstr( lpFileName( ".png" ) != NULL ) {     hDIB = PNGtoDIB( lpFileName );   } else if ( strstr( lpFileName( ".bmp" ) != NULL ) {     hDIB = BMPtoDIB( lpFileName );   } else if ( strstr( lpFileName( ".gif" ) != NULL ) {     hDIB = GIFtoDIB( lpFileName );   }   // HDIBが作成されているなら   if ( !hDIB ) {     hBmp = DIBtoOBJ( hDC, hDIB );   }   // 取得した HDCの開放   ReleaseDC( NULL, hDC );   return hBmp; } imctl_utl.cから『DIBtoOBJ』関数をアプリのCファイルにコピーしておいて使いましょう

usatan2
質問者

お礼

redfox63さん、回答ありがとうございます。 >以下のようにすればJPG,BMP,PNG,GIFからビットマップハンドルを取得できると思います 私が必要と思うのは、ビットマップハンドルではなく、デバイスコンテクストハンドルHDCなのに、何でビットマップハンドルなの?と、回答の真意を理解するまで、時間がかかりました(ふーっ)。 redfox63さんの提示くださった解決策は、 1、HDIBから、ビットマップハンドルhBitmapを取得し、 2、SelectObject(hMin,hBitmap);で、そのビットマップハンドルhBitmapに対するデバイスコンテクストハンドルhMin を作成し、 3、TransparentBltのパラメタにそのデバイスコンテクストハンドルhMinを使う ということですね。 その解決策にしたがって、プログラミングしたところ、お陰さまで、TransparentBltを使うことができ、特定の色RGB(r,g,b)を透明として描画することができました。 ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

HDIBからHDCを取得なんて出来ないと思いますよ HDCはアプリ側で用意する物だと思います BeginPaint( hWnd, &ps ); などで取得したPAINTSTRUCT構造体のhdcなどをつかって DIBtoDCに渡してやればいいようですが ・・・ YahooやGoogleなどで『imgctl.dll』を検索してみたのでしょうか? サンプルなどを公開しているサイトも見つかると思いますよ

usatan2
質問者

お礼

redfox63さん、今回も応答ありがとうございます(笑)。 >HDIBからHDCを取得なんて出来ないと思いますよ そうなんですか。 >HDCはアプリ側で用意する物だと思います >BeginPaint( hWnd, &ps ); >などで取得したPAINTSTRUCT構造体のhdcなどをつかって >DIBtoDCに渡してやればいいようですが ・・・ すいません、回答いただいた内容、難しくて理解できません。もう少し具体的に噛み砕いて説明ください。 私が質問したのは、HDIBが指している画像を、拡大・縮小して透明色を指定して、hdc=BeginPaint(hWnd,&ps);して取得したhdcに書き込みたいのですが、DIBtoDC()では、透明色の指定の仕方がわからないし、透明色の指定ができるTransparentBlt()を使うには、HDIBが指している画像のHDC hMinを取得してパラメタに指定する必要があり、行き詰っているので、解決策を教えてくださいという質問です。よろしくお願いします。 >YahooやGoogleなどで『imgctl.dll』を検索してみたのでしょうか? >サンプルなどを公開しているサイトも見つかると思いますよ それが私の検索の仕方が悪いのかみつからないのです。検索に使ったキーワードは思い出すだけでも、以下のとおりです。サンプルなどを公開しているサイトご存知でしたら紹介お願いいたします。 imgctl imgctl.dll imgctl.dll サンプル imgctl.dll 使い方 imgctl JPG imgctl 透明 imgctl 透過処理