3

我一直在尝试这样做,但由于某种原因,这只是给了我奇怪的结果:

int bpp = Screen.PrimaryScreen.BitsPerPixel;
string fontName = "Tahoma";
Font font = new Font(fontName, 10 * bpp, GraphicsUnit.Point);
Bitmap bm = new Bitmap(20 * bpp, 20 * bpp);
Graphics g = Graphics.FromImage(bm);
TextRenderer.DrawText(g, "a", font, new Rectangle(0, 0, 5 * bpp, 6 * bpp), Color.Black);
g.Flush();
pictureBox1.Image = bm;

我在这里做错了什么?我没有看到任何印在图片上的东西。如果我删除所有 bpp 引用,我可以看到它,但它非常小。

4

3 回答 3

5

您知道BitsPerPixel描述颜色深度(用于描述像素颜色的内存位数),与分辨率无关吗?

我假设您想要做的是以与分辨率相关的大小绘制文本,您可以通过引用对象的DpiXDpiY属性来做到这一点Graphics

更新

我不确定您是否需要为此计算 Dpi。您需要做的就是创建一个 Rectangle 来定义所需的文本大小,然后计算正确的字体大小以使文本适合矩形。以下是这样做的(但最大化垂直和水平方向的文本大小)。它可能会为您提供一些解决问题的建议:

Bitmap bm = new Bitmap(50, 50);
using (Font font = new Font(fontName, 10, GraphicsUnit.Point))
using (Graphics g = Graphics.FromImage(bm))
{
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    StringFormat stringFormat = new StringFormat()
    {
        Alignment = StringAlignment.Center,
        LineAlignment = StringAlignment.Near
    };
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
    // measure how large the text is on the Graphics object with the current font size
    SizeF s = g.MeasureString(text, font);
    // calculate how to scale the font to make the text fit
    float fontScale = Math.Max(s.Width / rect.Width, s.Height / rect.Height);
    using (Font fontForDrawing = new Font(font.FontFamily, font.SizeInPoints / fontScale, GraphicsUnit.Point))
    {
        g.DrawString(text, fontForDrawing, Brushes.Black, rect, stringFormat);
    }


}

如果你想用给定的磅值打印文本,你不需要去测量;只需设置字体大小:

Bitmap bm = new Bitmap(20, 20);
using (Font font = new Font(fontName, 6, GraphicsUnit.Point))
using (Graphics g = Graphics.FromImage(bm))
{
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    StringFormat stringFormat = new StringFormat()
    {
        Alignment = StringAlignment.Center,
        LineAlignment = StringAlignment.Near
    };
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
    g.DrawString(text, font, Brushes.Black, rect, stringFormat);
}
于 2009-06-17T11:19:07.163 回答
1

“a”很小有两个主要原因:

字体的高度是使用磅值来衡量的(它是 1/72 英寸,与像素数完全不同,因为不同的计算机屏幕每英寸的像素数不同)。

字体高度是从一行文本的顶部到底部测量的。由于一些字母有上升(“h”中的高条)而其他字母有下降(“g”的悬空位),“a”将仅占据字体高度的三分之一左右。

如果您希望“a”填充图像,则需要将其绘制成一个更大的矩形并“剪掉”“a”上方和下方的空白区域。如果您不太担心不同计算机上的屏幕 DPI,那么您可以进行试验,直到找到合适的字体大小(和绘制位置)。

于 2009-06-17T12:56:44.330 回答
1

我会尝试:

int ImgQual = 600;

int Width = 50;

int Height = 50;

Font TextFont = New Font("Tahoma", 14, FontStyle.Bold)

Bitmap bmp = New Bitmap(Width, Height);

bmp.SetResolution(ImgQual, ImgQual);

System.Drawing.Graphics g = Graphics.FromImage(bmp);

System.Drawing.StringFormat sf = New System.Drawing.StringFormat();

sf.Alignment = StringAlignment.Center;

g.DrawString("a", NumberTextFont, Brushes.Black, New RectangleF(0, 0, Width, Height), sf);

return bmp;
于 2009-06-17T11:23:56.870 回答