画像の作成中にアルファチャンネルを指定する必要があると思います。特定のピクセルにアルファチャンネルが存在しない場合、そのピクセルを透明にすることはできませんか?
はい、このAlphaBlend
関数は、アルファ チャネル情報が既に保存されている画像を描画することを目的としています。これらは 32 ピクセルあたりのビット数 (bpp) の画像で、赤、緑、青、およびアルファ チャネル情報が含まれていることを意味します。この関数は、画像に含まれる透明または半透明のピクセルを保持する点を除いて、AlphaBlend
と同様に考えることができます。BitBlt
この関数の鍵は、BLENDFUNCTION
構造体である最後のパラメーターです。ドキュメントには次のように書かれています。
ftn
[in] ソース ビットマップとデスティネーション ビットマップのアルファ ブレンディング関数、ソース ビットマップ全体に適用されるグローバル アルファ値、およびソース ビットマップの形式情報。ソースと宛先のブレンド機能は、現在 に限定されていAC_SRC_OVER
ます。
つまり、画像には事前に乗算されたアルファチャンネルが既に含まれていると想定されているということです。関数は画像を描画するときにこれらの値を尊重しますが、構造体のメンバーにAlphaBlend
0 ~ 255 の値を指定することで不透明度を調整できます。この値を 255 に設定すると、ビットマップのピクセルごとのアルファ値のみが使用されます。0 に設定すると、画像は透明であると見なされます。その中間に設定すると、画像がある程度の半透明で描画されます。SourceConstantAlpha
BLENDFUNCTION
alphablend関数を使用して画像の特定の部分を透明にすることは可能ですか?
RGB(0,0,255) の特定の領域を含む画像を作成できますか?その画像を描画すると、その領域のみが透明になります。
あなたがやろうとしていることは(kolendaが示唆しているように)、カラーキーイングと呼ばれるもののように思えます。基本的に、透明にしたい画像のあらゆる場所で特定の色 (RGB(0,0,255) など) を使用し、Windows に透明キーの色として RGB(0,0,255) を使用して画像を描画するように指示します。つまり、元の画像の RGB(0,0,255) であるすべてのピクセルは、描画される画像では透明になります。
はい、可能です。Windows では、ツールバーのボタン アイコンなどによく使われています。一般的に、フクシア色 (RGB(255,0,255)) が使用されます。普通に画像で。
これを担当する関数はTransparentBlt
関数です(これも に似ていますBitBlt
が、同じパターンで名前が付けられています)。これで重要なことは、カラー キー、つまり、画像を描画するときに透明として扱う特定の色を指定できることです。それが最後のパラメータですcrTransparent
。あなたの場合、指定したいと思いますRGB(0,0,255)
。
本当に派手にしたい場合は、TransparentBlt
との効果を組み合わせることができますAlphaBlend
。基本的には、最初に呼び出しTransparentBlt
て、すべてのキー カラーを透明として処理する一時的なデバイス コンテキスト (DC) にイメージを描画し、AlphaBlend
関数を使用して、その一時的な DC の内容をターゲット DC にブレンドし、透明効果を適用します。あなたが望む。
しかし、これは可能であり、コードを書いて動作させるとちょっとクールですが、RED SOFT ADAIRは、GDI は透明性を考慮して設計されていないと彼が言う点はまだあります。ここで説明する単純な透明効果よりもはるかに先に進むことはできません。また、それを行うのは確かに簡単ではありません。
透過性を使用して非常に多くの描画を行う必要がある場合は、代わりにGDI+ APIに切り替えた方がよいでしょう。これらは透過性のサポートがはるかに優れており、実際には C++ API として設計されているため (C フォールバックはありますが)、クラスに構造化されているため、操作がさらに簡単になります。
GDI+ の唯一の注意点は、Windows XP 以降でのみネイティブにサポートされていることです。クライアントがまだ Windows 2000 以前のバージョンを実行している場合はGdiplus.dll
、プログラムを実行するために GDI+ DLL ( ) を再配布する必要があります。それは最近ではますます参入障壁が少なくなってきていますが、それでも考慮に値するものです.