3

グラフィックス オブジェクトがビットマップから初期化され、その上にテキストが描画され、テキストが添付画像の最初の行のように見えるテキスト レンダリング メソッドを探しています。

誰かがこれを行う方法を説明できますか? 次の方法で再現できない理由がよくわかりません。

テスト中のフォント: Segoe UI、8.25pt

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
    base.OnPaint(e);

    //drawing the string with the Graphics object the form gives us
    e.Graphics.DrawString("1. This is a test using DrawString. " + e.Graphics.TextRenderingHint.ToString(), 
                          base.Font, Brushes.Black, new Point(10, 10));

    //width used for all images
    const int width = 300;

    //drawing the string with Graphics objects initialized from bitmaps
    Bitmap bmp = new Bitmap(width, 20);
    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.DrawString("2. This is a test using DrawString. " + gfx.TextRenderingHint.ToString(), 
                       base.Font, Brushes.Black, Point.Empty);
    }
    e.Graphics.DrawImage(bmp, new Point(10, 30));

    bmp.Dispose();
    bmp = new Bitmap(width, 20);

    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
        gfx.DrawString("3. This is a test using DrawString. " + gfx.TextRenderingHint.ToString(), 
                       base.Font, Brushes.Black, Point.Empty);
    }

    e.Graphics.DrawImage(bmp, new Point(10, 50));

    bmp.Dispose();
    bmp = new Bitmap(width, 20);

    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        gfx.DrawString("4. This is a test using DrawString. " + gfx.TextRenderingHint.ToString(), 
                       base.Font, Brushes.Black, Point.Empty);
    }

    e.Graphics.DrawImage(bmp, new Point(10, 70));

    bmp.Dispose();
    bmp = new Bitmap(width, 20);

    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
        gfx.DrawString("5. This is a test using DrawString. " + gfx.TextRenderingHint.ToString(),
                       base.Font, Brushes.Black, Point.Empty);
    }

    e.Graphics.DrawImage(bmp, new Point(10, 90));

    bmp.Dispose();
    bmp = new Bitmap(width, 20);

    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        using (GraphicsPath path = new GraphicsPath())
        {
            path.AddString("6. This is a test using GraphicsPath. " + gfx.TextRenderingHint.ToString(), 
                           base.Font.FontFamily, (int)base.Font.Style, 
                           base.Font.Size, Point.Empty, StringFormat.GenericDefault);

            gfx.FillPath(Brushes.Black, path);
        }
    }

    e.Graphics.DrawImage(bmp, new Point(10, 110));

    bmp.Dispose();
    bmp = new Bitmap(width, 20);

    using (Graphics gfx = Graphics.FromImage(bmp))
    {
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
        using (GraphicsPath path = new GraphicsPath())
        {
            path.AddString("7. This is a test using GraphicsPath. " + gfx.TextRenderingHint.ToString(),
                           base.Font.FontFamily, (int)base.Font.Style,
                           base.Font.Size, Point.Empty, StringFormat.GenericDefault);

            gfx.FillPath(Brushes.Black, path);
        }
    }

    e.Graphics.DrawImage(bmp, new Point(10, 130));

}

Form1_v2

4

1 に答える 1

3

コードにバグがあり、ビットマップを初期化するのを忘れています。これは、Color.Transparent、アルファ 0 の黒のピクセルで塗りつぶされます。テキストを描画すると、Graphics.DrawString() は、要求する TextRenderingHint を実装し、テキストをアンチエイリアスします。ただし、テキストの前景色は黒です。そして背景色は黒。したがって、アンチエイリアシング ピクセルは黒から黒にブレンドされます。アンチエイリアス効果を完全に台無しにして、文字の形をブロブに変えます。修理:

Bitmap bmp = new Bitmap(width, 20);
using (Graphics gfx = Graphics.FromImage(bmp))
{
    gfx.Clear(this.BackColor);
    // etc...
}
于 2013-07-16T18:13:42.767 に答える