(C #) Как нарисовать "а" с Tahoma с высотой = 6 - PullRequest
2 голосов
/ 17 июня 2009

Я пытался сделать это, но по какой-то причине это просто дает мне странные результаты:

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, я вижу это, но он довольно маленький.

Ответы [ 3 ]

5 голосов
/ 17 июня 2009

Вам известно, что 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);
}
1 голос
/ 17 июня 2009

Есть две основные причины, по которым «а» мало:

Высота шрифта измеряется с использованием размера точки (который составляет 1/72 от дюйма, весьма отличается от количества пикселей, поскольку на разных экранах компьютеров различное количество пикселей на дюйм).

Высота шрифта измеряется от верхней части строки текста до нижней. Поскольку у некоторых букв есть восходящие символы (высокая полоса в «h»), а у других - спусковые (немножко «g»), «a» будет занимать только примерно треть высоты шрифта.

Если вы хотите, чтобы ваше «а» заполнило изображение, вам нужно будет нарисовать его в большем прямоугольнике и «обрезать» пустые области выше и ниже «а». Если вас не слишком беспокоит разрешение экрана на разных компьютерах, вы можете просто поэкспериментировать, пока не найдете подходящий размер шрифта (и положение для рисования).

0 голосов
/ 17 июня 2009

Я бы попробовал:

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;
...