Рисование текста на растровом изображении - изображение получается черным - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь нарисовать текст на растровом изображении, и изображение получается черным.

protected Bitmap DrawTextImage(string text, float fontsize, string fontname = "Helvetica")
{
    string imagePath = @"C:\img.bmp";
    string imagePathTest = @"C:\imgTest.bmp";
    Font textFont = new Font(fontname, fontsize);
    var size = TextRenderer.MeasureText(text, textFont);
    Bitmap bmp = new Bitmap(size.Width, size.Height);

    Graphics graphics = Graphics.FromImage(bmp);
    SolidBrush brush = new SolidBrush(Color.Black);
    graphics.DrawString(text, textFont, brush, size.Width, size.Height);
    if(File.Exists(imagePathTest))
        File.Delete(imagePathTest);
    bmp.Save(imagePathTest, ImageFormat.Bmp);

Для того, чтобы это стоило, изображение также должно быть в конечном итоге преобразовано в растровый формат для печати. на термопринтере, но на данный момент я сосредоточен только на этой части.

Аргументы, которые я здесь использую, DrawTextImage(text, 36);

1 Ответ

2 голосов
/ 04 февраля 2020

Я пытаюсь нарисовать текст на растровом изображении, и изображение получается черным.

Полученное изображение черное, потому что вы рисуете черным ... на черном фоне . Причина черного фона в том, что по умолчанию растровые изображения имеют черный цвет.

Вам просто нужно вызвать FillRectangle (или Clear(), как указано в комментариях) другого цвета сразу после получения graphics до любой другой рисунок.

Изменение:

Graphics graphics = Graphics.FromImage(bmp);
SolidBrush brush = new SolidBrush(Color.Black);
graphics.DrawString(text, textFont, ...);

... на:

Graphics graphics = Graphics.FromImage(bmp);
graphics.FillRectangle (Brushes.White, 0, 0, size.Width, size.Height); // Fill to white
SolidBrush brush = new SolidBrush(Color.Black);
graphics.DrawString(text, textFont, ...);

Для более простого подхода попробуйте graphics.Clear(Color.White).

Советы

1. Удалять объекты GDI по завершении

Поскольку вы создаете явные Graphics и Brush, которые больше нигде не используются, будет хорошей идеей Dispose, когда вы закончите. Ресурсы GDI всегда были системным ограниченным ресурсом на Windows, независимо от разрядности и установленной оперативной памяти.

Например,

using (var graphics = Graphics.FromImage(bmp))
{
...
    graphics.DrawString(text, ...);
    if(File.Exists(imagePathTest))
        File.Delete(imagePathTest);
    bmp.Save(imagePathTest, ImageFormat.Bmp);
...
}

2. По возможности используйте предварительно определенные GDI-кисти / ручки

Вместо создания кистей, попробуйте использовать одну из уже существующих кистей или ручек. Их быстрее получить; не нужно утилизировать, потому что они общесистемные.

Вместо:

var brush = new SolidBrush(Color.Black);

... используйте:

_blackBrush = Brushes.Black; // optionally save in a field for future use
...