Я пытался это сделать, но по какой-то причине это просто дает мне странные результаты:
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, я могу это увидеть, но это довольно мало.
Вы знаете, что BitsPerPixel
описывает глубину цвета (количество бит памяти, которое используется для описания цвета пикселя ) и не имеет никакого отношения к разрешению?
Я предполагаю, что вы хотите сделать текст в размере, связанном с разрешением, которое вы можете сделать, обратившись к DpiX
и DpiY
свойства Graphics
.
Обновление
Я не уверен, что вам нужно привести Dpi в расчет для этого. Все, что вам нужно сделать, это создать прямоугольник, который определяет желаемый размер вашего текста, а затем вычислить правильный размер шрифта, чтобы текст был помещен внутри прямоугольника. Это делает (но максимизирует размер текста как по вертикали, так и по горизонтали). Это может дать вам несколько указателей для решения вашей проблемы:
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);
}
Есть две основные причины: "a" мало:
Высота шрифта измеряется с использованием точечного размера (который составляет 1/72 дюйма дюйма, что сильно отличается от количества пикселей, поскольку разные экраны компьютеров имеют разное количество пикселей на дюйм).
Высота шрифта измеряется от верхней части строки текста до нижней. Поскольку у некоторых букв есть восходящие линии (высокий бар в "h" ), а у других есть descenders (бит dgly "g" ), "a" будет занимать примерно треть высоты шрифта.
Если вы хотите, чтобы ваш "а" заполнил изображение, вам нужно нарисовать его в более крупном прямоугольнике и "отжать" пустые области выше и ниже "a" . Если вас не слишком беспокоит экран DPI на разных компьютерах, вы можете просто поэкспериментировать, пока не найдете размер шрифта (и позицию для рисования), который работает.
Я бы попробовал:
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;