9

透明なビットマップにアンチエイリアス処理されたテキストを描画し、アンチエイリアス処理をアルファ ブレンド ピクセルとして描画したいと考えています。このようにして、ビットマップを任意のカラー サーフェス (またはイメージ) に描画できますが、アンチエイリアシングは問題なく表示されます。

問題を示す簡単なサンプルを次に示します。

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));
}

結果は次のとおりです。

代替テキスト

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

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

4

2 に答える 2

16

ClearType サブピクセル アンチエイリアシング モードが有効になっているため (Vista 以降ではデフォルト)、テキストはそのまま表示されます。ClearType は、定義上、色をブレンドし、背景にとらわれないため、アルファ チャネルとうまく連携できません。したがって、アルファチャンネルを無視し、黒にブレンドします(それ以外の場合は透明色です)。目的の効果を得るには、プレーン グレースケール アンチエイリアシングを有効にする必要があります。

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
于 2009-08-18T00:22:53.393 に答える
3

本当に必要かどうかはわかりませんが、アルファ ブレンディングを行う場合は、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));

これはあなたが望むことをしていますか、それとも問題を隠しているだけですか?

于 2009-08-18T00:12:29.173 に答える