(C#)如何用高度= 6的Tahoma绘制"a"

Jor*_*nco 2 c# vb.net fonts system.drawing gdi+

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

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;
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*örk 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);
    }


}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)