我正在尝试将文本绘制到位图上,图像显示为黑色。
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);
我正在尝试将文本绘制到位图上,并且图像显示为黑色。
生成的图像是黑色的,因为您正在用黑色绘制...在黑色背景上。黑色背景的原因是位图默认为黑色。
您只需要在任何其他绘图之前获得graphics
后,将FillRectangle
(或注释中提到的Clear()
(调用为不同的颜色。
改变:
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 上的系统范围的有限资源,无论位数和已安装的 RAM 如何。
例如
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