
今、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を使った関数をお教えいただければうれしいです。
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ファイルにコピーしておいて使いましょう
redfox63さん、回答ありがとうございます。
>以下のようにすればJPG,BMP,PNG,GIFからビットマップハンドルを取得できると思います
私が必要と思うのは、ビットマップハンドルではなく、デバイスコンテクストハンドルHDCなのに、何でビットマップハンドルなの?と、回答の真意を理解するまで、時間がかかりました(ふーっ)。
redfox63さんの提示くださった解決策は、
1、HDIBから、ビットマップハンドルhBitmapを取得し、
2、SelectObject(hMin,hBitmap);で、そのビットマップハンドルhBitmapに対するデバイスコンテクストハンドルhMin を作成し、
3、TransparentBltのパラメタにそのデバイスコンテクストハンドルhMinを使う
ということですね。
その解決策にしたがって、プログラミングしたところ、お陰さまで、TransparentBltを使うことができ、特定の色RGB(r,g,b)を透明として描画することができました。
ありがとうございました。
No.1
- 回答日時:
HDIBからHDCを取得なんて出来ないと思いますよ
HDCはアプリ側で用意する物だと思います
BeginPaint( hWnd, &ps );
などで取得したPAINTSTRUCT構造体のhdcなどをつかって
DIBtoDCに渡してやればいいようですが ・・・
YahooやGoogleなどで『imgctl.dll』を検索してみたのでしょうか?
サンプルなどを公開しているサイトも見つかると思いますよ
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 透過処理
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アクセスしてきたコンピュータ...
-
VB .netにて現在時刻+1時間後...
-
Active directoryの全グループ取得
-
Flexgridで選択行の列の値を取...
-
VB.NETで DataRow()を利用して...
-
LAN内接続マシン数及びIP、マシ...
-
VBでFTPサーバ側のファイルの更...
-
時間を分に変換するプログラム
-
ASP(vbscript)におけるクライア...
-
EnumWindowsのコールバック関数
-
PHP8でWarning:Undefined varia...
-
Struts2 <s:select>タグの値取...
-
利用者側のMACアドレスを取得し...
-
秒以下は取得できないですか?
-
ExcelでNTPサーバーから時刻を...
-
ExcelVBAを使って、値...
-
13箇所の株価をエクセルにRSSで...
-
Accessのクエリで、replace関数...
-
3桁または4桁の数値を時刻に...
-
蔵書点検をバーコードリーダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
PHP8でWarning:Undefined varia...
-
count(*)で取得した値をJAVAの...
-
ListView 項目の選択/選択解除...
-
VBAでActiveDirectoryのユーザ...
-
VBA:小数点以下の数字を取得で...
-
JSP+Servletでのページングの常識
-
データ数をカウントしたいのですが
-
Flexgridで選択行の列の値を取...
-
利用者側のMACアドレスを取得し...
-
getParameter と getAttribut...
-
like演算子内に変数って使えな...
-
JavaScriptにおいてコンピュー...
-
郵便番号検索APIにてget Elemen...
-
DataGridView 複数選択で行番...
-
URIでのページの移動について
-
Spreadの選択行の取得について
-
指定のURLのタイトルを取得...
-
EXCELのリストボックスを選択し...
-
ListViewで複数選択された項目...
おすすめ情報