プロが教える店舗&オフィスのセキュリティ対策術

今、LoadImage()で読み込んだBMP画像を
BitBlt(hdc,x,y,dx,dy, hMin,0,0,SRCCOPY));や
TransparentBlt(hdc,x,y,dx,dy, hMin,0,0,dx,dy,RGB(r,g,b));
で画面に書くCプログラムがあります。このプログラムをBMP画像だけでなくPNG画像も扱えるように拡張しています。いろいろと調べた結果PNG画像を読み込むためにライブラリimgctl.dllを使うプログラムに変更している途中です。しかし、imgctl.dllではLoadImage()の代わりにToDIB()関数で読み込むため、JPEG画像もPNG画像も読めるのですが、独自のDIBデータハンドル(HDIB)で管理するためHDC(デバイスコンテクストハンドル)が取得できません。そのため、
問題1、画面書き出しはBitBlt()が使えない。
問題2、TransparentBlt()関数が使えない。
という問題があります。

問題1は、DIBtoDC()で代用することで、解決しましたが、問題2が未解決です。
お知恵をお貸しください。

たとえば、HDIBからHDCを得る方法、あるいは、特定の色RGB(r,g,b)を透明として扱うTransparentBlt()関数に代わるHDIBを使った関数をお教えいただければうれしいです。

A 回答 (2件)

HDIBからHDCを取得なんて出来ないと思いますよ



HDCはアプリ側で用意する物だと思います
BeginPaint( hWnd, &ps );
などで取得したPAINTSTRUCT構造体のhdcなどをつかって
DIBtoDCに渡してやればいいようですが ・・・

YahooやGoogleなどで『imgctl.dll』を検索してみたのでしょうか?
サンプルなどを公開しているサイトも見つかると思いますよ
    • good
    • 0
この回答へのお礼

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 透過処理

お礼日時:2008/06/02 07:38

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ファイルにコピーしておいて使いましょう
    • good
    • 1
この回答へのお礼

redfox63さん、回答ありがとうございます。
>以下のようにすればJPG,BMP,PNG,GIFからビットマップハンドルを取得できると思います
私が必要と思うのは、ビットマップハンドルではなく、デバイスコンテクストハンドルHDCなのに、何でビットマップハンドルなの?と、回答の真意を理解するまで、時間がかかりました(ふーっ)。

redfox63さんの提示くださった解決策は、
1、HDIBから、ビットマップハンドルhBitmapを取得し、
2、SelectObject(hMin,hBitmap);で、そのビットマップハンドルhBitmapに対するデバイスコンテクストハンドルhMin を作成し、
3、TransparentBltのパラメタにそのデバイスコンテクストハンドルhMinを使う
ということですね。

その解決策にしたがって、プログラミングしたところ、お陰さまで、TransparentBltを使うことができ、特定の色RGB(r,g,b)を透明として描画することができました。
ありがとうございました。

お礼日時:2008/06/02 22:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!