アルファ チャネルを使用して bmp 画像を表示するには、カスタム コントロールを作成する必要があります。背景はさまざまな色でペイントでき、画像には影があるため、アルファ チャネルを真に「ペイント」する必要があります。
誰もそれを行う方法を知っていますか?
また、可能であれば、アルファ チャネル情報を使用してマスクを作成し、マウスが画像をクリックしたのか、透明な領域をクリックしたのかを知りたいと思っています。
どんな種類の助けも大歓迎です!
ありがとう。
Edited(JDePedro): 何人かが示唆しているように、アルファ ブレンドを使用してビットマップをアルファ チャネルでペイントしようとしています。これは、リソースから 32 ビット ビットマップをロードし、AlphaBlend 関数を使用してペイントしようとして実装した単なるテストです。
void CAlphaDlg::OnPaint()
{
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
int nWidth = BitMap.bmWidth;
int nHeight = BitMap.bmHeight;
CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
BLENDFUNCTION m_bf;
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 255;
m_bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
これは単なるテストなので、ダイアログの OnPaint にコードを入れました (CDC オブジェクトの AlphaBlend 関数も試しました)。
不透明な領域は正しくペイントされていますが、ビットマップを透明にする必要がある場所が白くなります。
助けて?
これはスクリーンショットです。見にくいですが、青い円の周りに白い四角形があります: 代替テキスト http://img385.imageshack.us/img385/7965/alphamh8.png
Ok。わかった!アルファ値のすべてのピクセルを事前に乗算する必要があります。誰かがそれを行うための最適化された方法を提案できますか?