tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル透過pngの作成
記事No14597
投稿日: 2010/04/05(Mon) 14:07
投稿者Flash
環境はVB6 SP6、Vista 32bitです。
透過pngを作りたいと思っています。

今はピクチャーボックスに画像を表示、
GdipSaveImageToFileを呼び出してpng作成まではできてます。

ピクチャーボックスの指定色を透過させて保存できると助かります
VB6で可能でしょうか?

過去ログは「透過」などで検索済みです。
よろしくお願いします

[ツリー表示へ]
タイトルRe: 透過pngの作成
記事No14599
投稿日: 2010/04/05(Mon) 18:49
投稿者魔界の仮面弁士
.NET であれば MakeTransparent メソッド一発なのですが、
GDI+ Flat API だと、結構面倒かも…。


(0) GDI+ を使うために、GdiplusStartup API を呼び出しておく。

(1) PictureBox の Image プロパティや Picture プロパティ、あるいは
 LoadPicture などを使って、処理対象の Picture オブジェクトを得る。

(2) (1) の Handle プロパティを指定して GdipCreateBitmapFromHBITMAP API を呼び出し、
 Picture オブジェクトを GDI+ の Bitmap オブジェクトのハンドルに変換する。

(3) (1) の画像と同サイズの新規 Bitmap を GdipCreateBitmapFromScan0 API 等で生成する。
 このとき、PixelFormat には PixelFormat32bppARGB を指定しておく。
 なお、(1) の Width / Height プロパティは HiMetric 単位系なので注意。

(4) GdipGetImageGraphicsContext API で、(3) の Bitmap から Graphics を生成。
 これが変換結果のためのキャンバスとなる。

(5) ここからが本題。
 GdipGraphicsClear API を使い、(4)の Graphics を完全透過色でクリアする。

(6) GdipCreateImageAttributes API で、ImageAttributes を作成。

(7) GdipSetImageAttributesColorKeys API で、(6) に『透明にしたい色』を指定。

(8) GdipDrawImageRectRectI API 等で、(4)のGraphics に対して、
 (6) の ImageAttribute 指定で (2)の元 Bitmap を描画。

(9) 不要になったオブジェクトを、それぞれ破棄する。
 元画像として得た (2) の Bitmap は、GdipDisposeImage API、
 描画キャンバスとなった (4) の Graphics は、GdipDeleteGraphics API、
 (6) の ImageAttributes は、GdipDisposeImageAttributes API。

(10) 出力結果である (3) の Bitmap から、透過 PNG ファイルを作成。
 ここで GdipSaveImageToFile API を呼び出す手順については、説明不要ですよね。

(11) あとは、GdipDisposeImage でオブジェクトを破棄し、
 GdiplusShutdown での後始末をして終了。

[ツリー表示へ]
タイトルRe^2: 透過pngの作成
記事No14600
投稿日: 2010/04/05(Mon) 22:42
投稿者Flash
>魔界の仮面弁士 様
お返事ありがとうございます。

とりあえず教えていただいたAPIの宣言を集めて、(3)にきました。

ここでまた質問ですが
・HiMetric(0.01mm単位)はGdipGetImageHeightを使えばその単位で出ますか?
・GdipGraphicsClearの第2引数に色を指定すると思いますが、
完全透過色の値があるということでしょうか?

いちおう試しながらやってみますが、よかったらご回答願えますでしょうか?
よろしくお願い致します

[ツリー表示へ]
タイトルRe^3: 透過pngの作成
記事No14601
投稿日: 2010/04/05(Mon) 23:23
投稿者魔界の仮面弁士
> ・HiMetric(0.01mm単位)はGdipGetImageHeightを使えばその単位で出ますか?
GdipGetImageHeight/GdipGetImageWidth から返されるのはドット数ですね。
GdipDrawImageRectI が要求する値もドット単位なので、そのまま使えます。

一方、
 Dim p As Picture
 Set p = LoadPicture(…)
 h = p.Height
 w = p.Width
などで得たサイズについては HiMetric です。GdipGetImageHeight 等を使わない場合は、
ここから得たサイズを Pixel 単位系に変換して使用することもできます。
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200802/08020029.txt
http://bbs.wankuma.com/index.cgi?mode=al2&namber=8734&KLOG=20


> ・GdipGraphicsClearの第2引数に色を指定すると思いますが、
> 完全透過色の値があるということでしょうか?
第2引数は argb ですよね。すなわち、a=Alpha(透明度)、r=Red、g=Green、b=Blueです。
32bit整数値を &Hxxrrggbb とみた場合、xx=00 だと完全透過、xx=FF だと完全不透明かと。

[ツリー表示へ]
タイトルRe^4: 透過pngの作成
記事No14602
投稿日: 2010/04/06(Tue) 01:41
投稿者Flash
あっ読み間違えておりました。
> なお、(1) の Width / Height プロパティは HiMetric 単位系なので注意。
GdipCreateBitmapFromScan0 のWidth、Heightに
HiMetric単位の数値を与えないといけないと思い込んでいました。
了解しました。

透明度も今までrgbしか扱ったことがなかったので、よくわかっておりませんでした。
とても勉強になりました。

先ほど試したところ、透過できました。
もう少しAPIの意味など調べて完成させようと思います
魔界の仮面弁士様がいなかったら自分では作れませんでした…
本当にありがとうございました!

[ツリー表示へ]