今、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.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 透過処理
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)を透明として描画することができました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- その他(プログラミング・Web制作) Leafletで画像をon、offさせる方法について 2 2022/11/01 15:34
- 画像編集・動画編集・音楽編集 画質を落とさず切り取って透過したいです 2 2022/06/08 12:28
- Windows 10 再起動後 Pinが使用できず、PC(windows11)にサインインできない 3 2022/08/30 20:53
- LINE LINEアプリ内のQRコードリーダーがカメラのピントが合わず読み込めません。 2 2022/08/26 15:39
- その他(パソコン・周辺機器) iPhone→ PC取り込んだHDR動画が白くなってる 1 2023/07/24 22:55
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- 数学 画像の問題について、途中式~解答までをなぜそうなるのかの解説ふまえて教えてほしいです。 (打ち込むと 1 2023/02/23 11:50
- 高校 現代文の質問 4 2022/10/03 11:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
データ数をカウントしたいのですが
-
count(*)で取得した値をJAVAの...
-
VBAでActiveDirectoryのユーザ...
-
Flexgridで選択行の列の値を取...
-
ListView 項目の選択/選択解除...
-
リストビュー:先頭行のアイテ...
-
時間を分に変換するプログラム
-
ドロップダウンリストの初期表...
-
like演算子内に変数って使えな...
-
EXCELのリストボックスを選択し...
-
getParameter と getAttribut...
-
asp.netでtextboxの値を取得
-
ListViewで複数選択された項目...
-
imgctl.dllを使って読み込んだ...
-
VB6.0のレジストリ情報取得方法
-
Google Apps Script で、Web上...
-
利用者側のMACアドレスを取得し...
-
.NETで現在時刻を常に動作させ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
like演算子内に変数って使えな...
-
count(*)で取得した値をJAVAの...
-
利用者側のMACアドレスを取得し...
-
データ数をカウントしたいのですが
-
JavaScriptでWindowsログオンID...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
VBA リストボックス複数選択か...
-
getParameter と getAttribut...
-
Excel VBA でログインしてい...
-
VBScriptで数値にコンマを付け...
-
Spreadの選択行の取得について
-
コンボボックスの表示は最大何行?
-
コンボボックス表示文字列を取...
-
VB .netにて現在時刻+1時間後...
おすすめ情報