我有以下代码,它接受一个字符串并将其添加到内存中的Bitmap,然后将其另存为BMP文件。我目前的代码如下:
string sFileData = "Hello World";
string sFileName = "Bitmap.bmp";
Bitmap oBitmap = new Bitmap(1,1);
Font oFont = new Font("Arial", 11, FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel);
int iWidth = 0;
int iHeight = 0;
using (Graphics oGraphics = Graphics.FromImage(oBitmap))
{
oGraphics.Clear(Color.White);
iWidth = (int)oGraphics.MeasureString(sFileData, oFont).Width;
iHeight = (int)oGraphics.MeasureString(sFileData, oFont).Height;
oBitmap = new Bitmap(oBitmap, new Size(iWidth, iHeight));
oGraphics.DrawString(sFileData, oFont, new SolidBrush(System.Drawing.Color.Black), 0, 0);
oGraphics.Flush();
}
oBitmap.Save(sFileName, System.Drawing.Imaging.ImageFormat.Bmp);
我遇到的问题是当我在Paint中查看BMP文件时,位图的大小是否正确定义,背景为白色,但是它们没有文本?
我做错了什么?
答案 0 :(得分:6)
您正在创建Bitmap
对象,然后在Graphics
语句中将using
对象绑定到该对象。但是,然后您销毁该Bitmap
对象并创建一个丢失原始绑定的新对象。尝试只创建一次Bitmap
。
修改强>
我看到你试图将Graphics
对象用于两个目的,一个用于衡量事物,另一个用于绘制。这不是一件坏事,但会导致你的问题。我推荐reading the threads in this post for an alternative way for measuring strings。我将使用我个人最喜欢的helper class from this specific answer。
public static class GraphicsHelper {
public static SizeF MeasureString(string s, Font font) {
SizeF result;
using (var image = new Bitmap(1, 1)) {
using (var g = Graphics.FromImage(image)) {
result = g.MeasureString(s, font);
}
}
return result;
}
}
string sFileData = "Hello World";
string sFileName = "Bitmap.bmp";
Font oFont = new Font("Arial", 11, FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel);
var sz = GraphicsHelper.MeasureString(sFileData, oFont);
var oBitmap = new Bitmap((int)sz.Width, (int)sz.Height);
using (Graphics oGraphics = Graphics.FromImage(oBitmap)) {
oGraphics.Clear(Color.White);
oGraphics.DrawString(sFileData, oFont, new SolidBrush(System.Drawing.Color.Black), 0, 0);
oGraphics.Flush();
}
oBitmap.Save(sFileName, System.Drawing.Imaging.ImageFormat.Bmp);
答案 1 :(得分:0)
您似乎正在中途交换位图。您似乎正在执行以下操作:
问题是你仍在使用与旧(第一个)位图相关联的图形句柄(来自第2步),而不是新的(第二个)位图。
您需要使用与新(第二)位图关联的图形句柄,而不是旧的(第一个)位图。