レイヤードウィンドウを使用して、画面に角の丸い長方形を描画しています。ただし、ギザギザのエッジを滑らかにしたいのですが。これにはアルファブレンディングが必要だと思います。GDIでこれを行う方法はありますか?
4 に答える
DIBセクションを作成します。BITMAPINFOHEADER に 32bpp を入力します。あらかじめ乗算されたアルファでアルファ チャネルを埋めれば、準備完了です。
AlphaBlend は、aplha チャネルを使用して 32 bpp ビットマップを実際にブリットするための API です。
GDIの代わりにGDI+を使用する可能性はありますか? 箱から出してすぐにアンチエイリアスと透明度をサポートします。
BitMap クラスの LockBits メソッドを使用して、C# でこれを行うことができます (説明については、この質問を参照してください)。GetPixel と SetPixel は非常に遅いため、絶対に使用しないでください (ビットマップ全体ではなくエッジのみを操作する場合でも)。
GDI呼び出しだけでそのような描画を行う簡単な方法はありません。必要なのはアルファブレンディングだけではありません。アンチエイリアシングが必要です。これには通常、必要なものをより大きな解像度で描画してから縮小することが含まれます。
同様の問題に対して私が過去に行ったことは、アートプログラムを使用して、必要な形状(丸みを帯びた角など)を白黒で必要以上に大きく描画することです。描画したいときは、白黒のビットマップを任意のサイズにスケーリングしました(Code Projectのスケーリングクラスのバリアントを使用)。これにより、アルファチャネルとして使用できるグレースケール画像が得られます。この画像は、Win32関数AlphaBlendを呼び出すか、DIBSectionを使用して適切なピクセルを手動で変更することにより、アルファブレンディングに使用します。
このアプローチの別のバリエーションは、最終結果の約4倍のDIBSectionを割り当て、それを描画してから、上記のスケーリングクラスを使用してスケールダウンすることです。より大きな画像からのスケーリングにより、適切なスムージング効果が得られます。 。
これがすべて非常に多くの作業のように聞こえる場合は、そうです。
編集:この質問のタイトルに答えるには:CreateDIBSectionを呼び出すことにより、アルファチャネルでビットマップを作成できます。それだけではあなたが望むことはできませんが、私は思います。