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