VC++2013 MFC環境です。
プログラムで○や×などの記号のアイコンを描画し、PNG,GIF,JPEGの形式でファイルに保存したいです。その時、アイコンの背景を透過したいのですがうまくいきません。
CDCクラスとCImageクラスを使用しアイコンの出力をしています。
背景透過について調べていくつか使えそうな関数があり試したのが、TransparentBltという関数で、デバイスコンテキストを二つ用意して、片方に記号を描画し、透過したい色を指定してもう片方にコピーすると指定した色が透過になる?と解釈しプログラム組みましたが結果は真っ黒の画像でした。
ここで完全に手が止まってしまい、質問させていただきます。
以下ソース
CImage Image, image2;
Image.Create( 50, 50, 24 );
image2.Create( 50, 50, 24 );
CDC* pDC = CDC::FromHandle( Image.GetDC( ) );
CDC* pdc2 = CDC::FromHandle( image2.GetDC( ) );
CRect rect( 0, 0, 50, 50 );
CPen BlackPen( PS_SOLID, 3, RGB( 0, 0, 0 ) );
CBrush WhitBrush( RGB( 255, 255, 255 ) );
CBrush BlackBrush( RGB( 0, 0, 0 ) );
pDC->FillRect( &rect, &WhitBrush );
pDC->SelectObject( &BlackPen );
pDC->SelectObject( &WhitBrush );
pDC->Ellipse( 5, 5, 45, 45 );
COLORREF col = Image.GetPixel( 0, 0 );
pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col );
Image.SetTransparentColor( col );
image2.Save( L"c:\\icon\\maru.png" );
Image.ReleaseDC( );
image2.ReleaseDC( );
他にも実装例があれば教えてください。
C++や画像生成に関しては経験がありません。
お礼
解決いたしました!! 上記のコードを試してみたところ、背景透明の画像が生成できました。 ありがとうございます! アルファチャネルには一度目を通したのですが、サンプルも少なく、 引数の指定などに困惑して使うことを諦めていました。 自分でももう一度目を通したのですが、 .CreateEx(50, 50, 32, BI_RGB , 0, CImage::createAlphaChannel); アルファチャネルの指定をするのに、この辺の指定は限られている?ようですね。 自分では到底たどり着けることがなかったと思います。。 後、 unsigned char* pCol32 = (unsigned char *)Image.GetPixelAddress(x, y); でアドレスを取得して色の判断と透過度の設定をしているようですが、 どのような構造になっているのか気になりました。 最後に、 初めて質問サイトを利用させていただきましたが、こんなに早く解決できたのに驚きです! 回答していただき本当にありがとうございました。