Я пытаюсь нарисовать текст на растровом изображении, и изображение получается черным.
Полученное изображение черное, потому что вы рисуете черным ... на черном фоне . Причина черного фона в том, что по умолчанию растровые изображения имеют черный цвет.
Вам просто нужно вызвать 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