タイトル | : Re: 透過pngの作成 |
記事No | : 14599 |
投稿日 | : 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 での後始末をして終了。
|