2009-08-17 23 views
8

透明ビットマップにアンチエイリアス処理されたテキストを描画し、アルファブレンドされたピクセルとして描画されたアンチエイリアス処理をしたいと思います。このようにして、ビットマップを任意の色のサーフェス(またはそのイメージ)に描画することができ、アンチエイリアス処理は正常に動作します。ここで透明ビットマップのアンチエイリアステキスト

は問題を簡略化して示すサンプルです:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Bitmap bitmap = new Bitmap(this.Width, this.Height); 
    Graphics g = Graphics.FromImage(bitmap); 
    g.Clear(Color.Empty); 
    g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 
    e.Graphics.DrawImage(bitmap, new Point(0, 0)); 
} 

そして、ここではその結果です:

alt text http://img194.imageshack.us/img194/9065/captureotd.png

本の究極の目標は、私の透明​​アルファブレンドを描画するためにUpdateLayeredWindow使用することです窓。私はConkyのようなアプリケーションを作成しています。テキスト用にClearTypeレンダリングを使用したいと考えています(これはもちろんアンチエイリアスなしで簡単です)。

現在、フォームの背後にある画面をつかみ、描画してからテキストを描画します。それは良く見えますが、更新する必要があり、描画が遅くなります。デスクトップ上にテキストを描画するための他のアイデアも歓迎します。

答えて

15

ClearTypeサブピクセルアンチエイリアスモードが有効になっているため、テキストがそのまま表示されます(これはVista以上ではデフォルトです)。 ClearTypeは、定義によって、アルファチャンネルでうまく再生できません。なぜなら、それは色をブレンドし、背景に依存しないからです。したがって、アルファチャンネルは無視され、黒にブレンドされます(それ以外の場合は透明色です)。

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

これはうまくいきました、ありがとう!それはClearTypeほどきれいではありませんが、ClearType(Consolasなど)用に設計されたフォントでさえもうまく見えます。 – iano

+0

奇妙なことに、私のために 'AntiAliasGridFit'はアンチエイリアスがゼロのテキストを生成します。しかし、「アンチアリア」は働いている。 –

+0

フォントサイズが小さすぎると 'AntiAliasGridFit'がアンチエイリアスを行わないことがあります。このようなフォントサイズでは、 'AntiAlias'はとにかく醜い結果をもたらします。 –

1

が、私はそれが本当に必要かどうかわからないんだけど、あなたはアルファブレンディングを行いたい場合は、あなたが32ビットの画像を指定する必要がありますあなたの例を使用して

Bitmap bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

を、私は作ることができました

g.Clear(Color.Empty); 
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 

が、これはあなたが望むものをやって、あるいは単に問題を隠している:テキストはテキストの描画ヒントを追加することによって、まともに見えますか?

+3

'Bitmap'の' PixelFormat'を省略すると、デフォルトでは 'Format32bppArgb'がデフォルト設定になります。 –