• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++でのアイコン背景透過について)

VC++でのアイコン背景透過について

このQ&Aのポイント
  • VC++2013 MFC環境で、プログラムでアイコンを描画し、背景を透過したいです。
  • CDCクラスとCImageクラスを使用してアイコンの出力をしていますが、TransparentBlt関数を試した結果、画像が真っ黒になってしまいます。
  • 他にも背景透過の実装例があれば教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • heburusu
  • ベストアンサー率85% (140/164)
回答No.3

こんにちわ。 >そこで思ったのが透過色に設定した色はしっかり透過されているが、 >下地の黒が見えている状態なのではないかと・・・。 失礼しました。 仰られる通りです・・・。 TransparentBltは透過して転送するだけなので、 透過されて上書きされないimage2の画素はそのまま=黒のままですね。。。 なので、image2をsaveする段階で透過色を指定できないとということですが、 また間違っているかもしれませんが、アルファチャネルつきのImageを作成してSaveするとできるかもしれません…。 以下は32ビットのアルファチャネル付きの画像(CImage)を作成し、保存するサンプルですが動くかはわかりません。。。 アルファチャネル画像については検索頂ければと思いますが、1画素がRGBに透明情報を追加した画像形式です。 もし宜しければお試しください…。 -- CImage Image; Image.CreateEx(50, 50, 32, BI_RGB , 0, CImage::createAlphaChannel); CDC* pDC = CDC::FromHandle( Image.GetDC( ) ); //Image(pDC)に図形を描画 ... // //アルファチャネル付き画像を1ピクセルずつ走査 for(int y = 0; y < 50; y ++) { for(int x = 0; x < 50; x ++) { unsigned char* pCol32 = (unsigned char *)Image.GetPixelAddress(x, y); if(pCol32[0] == 0 && pCol32[1] == 0 && pCol32[2] == 0) { //黒=RGB(0,0,0)の場合はα=0(透過)にする pCol32[3]=0; } else { //黒=RGB(0,0,0)以外はα=255(不透過)にする pCol32[3]=255; } } } //png形式で保存 Image.Save( L"c:\\icon\\maru.png" ); --

polyn3
質問者

お礼

解決いたしました!! 上記のコードを試してみたところ、背景透明の画像が生成できました。 ありがとうございます! アルファチャネルには一度目を通したのですが、サンプルも少なく、 引数の指定などに困惑して使うことを諦めていました。 自分でももう一度目を通したのですが、 .CreateEx(50, 50, 32, BI_RGB , 0, CImage::createAlphaChannel); アルファチャネルの指定をするのに、この辺の指定は限られている?ようですね。 自分では到底たどり着けることがなかったと思います。。 後、 unsigned char* pCol32 = (unsigned char *)Image.GetPixelAddress(x, y); でアドレスを取得して色の判断と透過度の設定をしているようですが、 どのような構造になっているのか気になりました。 最後に、 初めて質問サイトを利用させていただきましたが、こんなに早く解決できたのに驚きです! 回答していただき本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.2

こんにちわ。 失礼しました。 真っ黒の画像のままですか・・・。 参考URLのblogを見ると、SetTransparentColorは不要でTransparentBltを使えば透過されるようですね(8Bit以外でもできそうです)。 まずは、透過前の画像が正しく生成されているか確認されるのはどうでしょうか? image2.Saveの前にimage.Saveを追加して出力される画像は図形が表示されるでしょうか? >image.Save( L"c:\\icon\\image.png" );

参考URL:
http://d.hatena.ne.jp/twhs/20080129/1201629635
polyn3
質問者

補足

こんにちは! あれからいろいろ試してみました。 >>image2.Saveの前にimage.Saveを追加して出力される画像は図形が表示されるでしょうか? Image.saveに関しましては、しっかり描画してくれます。 少し気づいたのが、TransparentBltで透過色に設定した色が絶対に黒になってしまうこと。(部分的に透過設定をしていきその都度、.saveを行い、検証) まず最初にImageをCreateしたときの画像は真っ黒でした。 そこで思ったのが透過色に設定した色はしっかり透過されているが、 下地の黒が見えている状態なのではないかと・・・。 だとしたら、どうしようもないのでは?と思ってしまいました。勘違いかもしれませんが・・・。 ん~難しいです。解析力がなく非常に作業難航しております T0T

すると、全ての回答が全文表示されます。
  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

TransparentBltの前にSetTransparentColorをするようにするとどうでしょうか? -- Image.SetTransparentColor( col ); pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col ); -- また、参考URLのSetTransparentColorの説明を読むと、 "The index, in a color palette, of the color to set to transparent." と記述があるので、8bit(カラーパレット)画像だけしか使えないのかもしれないです。 (24bitのpng画像を作成されているようなので) 他の方法としては、GDI+のAPIを使う方法やOpenCVの外部ライブラリを使う方法もあると思います。 C++/MFCにこだわらないのでしたら、C#(.NET)で実装するほうが簡単とは思いますが…。

参考URL:
https://msdn.microsoft.com/ja-jp/library/w7bz08yk.aspx
polyn3
質問者

補足

早速の回答ありがとうございます。 >>TransparentBltの前にSetTransparentColorをするようにするとどうでしょうか? ダメでした。出力されるのは全部黒い画像です。 >>8bit(カラーパレット)画像だけしか使えないのかもしれないです。 なんとなく24bitの画像で出力してましたが、8bitにするとそもそも何も描画できない?ようになります。黒の画像しか生成されない。私にはこれがどういうことだかさっぱり理解できません。 >>C++/MFCにこだわらないのでしたら、C#(.NET)で実装するほうが簡単とは思いますが…。 このアイコン生成プログラムはMFCのアプリに組み込もうと思っているので、こだわりがあります・・・ すみません。どうしても解決したいです。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A