CImage::AlphaBlend ?

解決


しゅん  2008-05-27 10:22:37  No: 68427

お世話になっております
Visual Studio 2005 XP/Vista MFC環境で開発しています。

CStaticを継承した自前のクラスのOnPaintで自前の背景画像(24Bit BMP)を表示しています。このBMPの上に透過値を持つ小さいPNGを描画したいです。

CImage::AlphaBlendを使えばひゃらっと出来たりしないかしら、と淡い期待を寄せて使ってみたのですが、画像は表示される物の、透過部分が透過になってたりならなかったりという状態です。

ご指南頂けないでしょうか。

MyStatic::OnPaint()
{
    // 背景BMPをdcで描画..
    //
    CDC*    pDC = GetDC();
    CDC      cDC;
    CImage    Img;
    CBitmap    Bmp;
    CBitmap*  oldBmp;
    SIZE    Size;

    Img.Load( _T( "mark.png" ) );
    Size.cx = Img.GetWidth();
    Size.cy = Img.GetHeight();

    cDC.CreateCompatibleDC( pDC );
    Bmp.CreateCompatibleBitmap( pDC, Size.cx, Size.cy );
    oldBmp = cDC.SelectObject( &Bmp );
    Img.AlphaBlend( pDC->GetSafeHdc(), 0, 0, Size.cx, Size.cy, 0, 0, Size.cx, Size.cy );
    Img.Destroy();
    cDC.SelectObject( oldBmp );
    Bmp.DeleteObject();
    cDC.DeleteDC();
}


しゅん  2008-05-27 10:24:07  No: 68428

あ、便宜上OnPaintでファイルのロードを書いてますが、追い出します。


そだ  2008-05-27 11:03:17  No: 68429

AlphaBlendって半透明っぽい効果をだすものでは?
透過色はまた別の話な気がしますよ。

http://f1.aaa.livedoor.jp/~zahyou/cgame/auto_sprite.htm


rin  2008-05-27 21:21:57  No: 68430

透過色による透過ではなく、
ピクセルごとのα値設定による透過だからAlphaBlendで問題ないかと

>透過部分が透過になってたりならなかったりという状態です。
ここんところ、どういう条件変更したのかかかれてないし
もしかすると、条件変更なしで、起動もしくはOnPaintが呼ばれるたびに
結果がかわる・・・なんてことなのかもしれないけど

とりあえず私の経験上ですが
だいたい4×4以下の画像は透過しなかったです


しゅん  2008-05-28 00:54:24  No: 68431

そださん、Rinさん有難うございます。

結局、AlphaBlend関数を用いずにBYTEバッファに読んでPixel単位で透過処理してしまいました。

結果的に望んでいたピクセル単位での透過処理が出来ました。
有難うございます。

***

ちなみに、ですが、イメージは CImage を用いて読み込みしているのですが、CImage を用いたプロジェクトで「共有DLLでMFCを使う」プロジェクトにしていた場合というのは、追加DLL不要で単体で動く物なのでしょうか?

今ひとつ、ATL、GDIという存在自体が良く分かっておりません・・・。


そだ  2008-05-28 04:33:43  No: 68432

共有DLLだとWindow内にあるDLLを
複数のアプリケーションで共有して使う。
必然的にダイナミックリンクになるし、
dllのバージョンがインストール先の環境で異なる。

スタティックリンクはビルト時に
実行ファイル内にMFC側のコードを
収めちゃう。共有DLLは使わない。


しゅん  2008-05-29 09:28:32  No: 68433

# 本題は解決したので解決チェックしますです。

そださん、回答有難うございます。

はい。スタティックはMFCのDLLを内包するのですが、ATLやGDI+といった物がMFCの範囲の一部なのか、外部なのかが良く分かって無いという意味で書きました。

プロジェクトの構成プロパティ、全般内にもMFCとは別に「ATLの使用
」という欄が有りますが、これのはい・いいえに関わらず、スタティックリンクでは追加DLLが必要無しになるのだろうか、という疑問です。

例えばATLを使用するにすると明示的に #include <atlimage.h> 等をしなくても使えますよという様なだけの物なのでしょうか?

# ATLはCOM Interfaceのラッパー(?)


そだ  2008-05-29 19:39:56  No: 68434

これみるかぎり
http://msdn.microsoft.com/ja-jp/library/8x480de8(VS.80).aspx
スタティックリンクとダイナミックリンクの切り替えっぽいですけどねん。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加