2009-07-24 11 views
2

私は、レイヤードウィンドウを使用して、画面上に丸い四角形を描画しています。しかし、私はギザギザのエッジを滑らかにしたいと思います。私はこれにアルファブレンディングが必要だと思います。 GDIでこれを行う方法はありますか?GDIを使用してオンザフライでアルファチャンネルを使用してビットマップを作成するにはどうすればよいですか?

答えて

3

CreateDIBSection。 BITMAPINFOHEADERに32bppを入力します。あらかじめ乗算されたアルファでアルファチャンネルを入力してください。

AlphaBlendは実際aplhaチャネルと32のBPPビットマップをブリットするためのAPIです。

0

あなたは(説明のためにthis questionを参照)BitmapクラスのするLockBitsメソッドを使用してC#でこれを行うことができます。これはGetPixelとSetPixelを使用したくないということです。(ビットマップ全体ではなく、エッジを操作していても)ぞっとするほど遅いです。

+0

悲しいことに、私は管理された言語を使用していません。私は、バニラWindows APIを使用する必要があります。 – wkf

+0

それは、私だけではありません。 =) – MusiGenesis

-1

GDIコールだけで簡単に描画することはできません。あなたが望むのはアルファブレンディングだけではありません。アンチエイリアスが必要です。これには、通常、より大きな解像度で描画して縮小することが含まれます。私は同様の問題のために、過去に何をやったか

は、私は黒と白で、それを必要以上に大きく(例えば、丸みを帯びたコーナーを)好きな形状描画するアートプログラムを使用することです。私はそれを描画したいと思ったときに、黒と白のビットマップを私が望むどのようなサイズにもスケールアップしました(scaling class from Code Projectの亜種を使用)。これにより、アルファチャンネルとして使用できるグレースケール画像が得られます。アルファブレンディングは、AlphaBlendを呼び出すか、DIBSectionを使用して適切なピクセルを手動で変更してアルファブレンディングに使用します。

このアプローチの別のバリエーションは、最終結果が望むよりも約4倍大きいDIBSectionを割り当て、それを描画し、上記のスケーリングクラスを使用してスケーリングすることです。適切なスムージング効果。

このすべては、仕事のかなり多くのように聞こえる場合:まあ、それはです。

編集:この質問のタイトルに答えるために:あなたはCreateDIBSectionを呼び出すことによって、アルファチャンネル付きビットマップを作成することができます。それは自分では望んでいないことだと思います。

+0

私は今日の午後にMSDNを精練しながらCreateDIBSectionを見つけました。それは欠けているようです。アンチエイリアス処理された線や円を描画するにはWuの線/円アルゴリズムを使用します。私が実際のピクセルデータにアクセスできる限り、私はそれを私が望むものに設定することができます。そしてあなたは正しい。それは多くの仕事になっています! ; p – wkf

+0

あなたは基本的にそこにいるように聞こえます。 DIBセクションはグラフィックス作業に最適です:HBITMAPハンドルを取得しますが、生のピクセルデータにもアクセスできます。 – DavidK

+0

アンチエイリアスは「縮小」されていませんが、スムーズな外観を得るために、斜めに塗りつぶしたピクセルを追加しています。追加されたピクセルにアルファ成分がある場合(アルファブレンディングを使用している場合など)、これはより効果的です。 – Eric

0

GDI+を使用しての代わりに、GDIの任意のチャンス?これは、すぐにアンチエイリアスと透過性をサポートします。

+0

私がGDI +を使用した場合、フラットなAPIに悩まされていました。 GDI +が自分の仕事を楽にしてくれたとしても、私はもっと「クラスフレンドリーな」ものに切り替えることに誘惑されるでしょう。私はこれをチェックします。ありがとう! – wkf

+0

私は、ギザギザの問題もあります。私は 'CImage :: AlphaBlend'を実行しているときにGDI +を使用しています。 – sergiol

+0

@sergiolあなたに役立つ情報はほとんどありません。私は新しい質問を開くことをお勧めします。 –

関連する問題