创建位图并在C#中保存到文件给我一个位图上的空文本

时间:2014-01-22 16:29:29

标签: c# bitmap image-manipulation

我有以下代码,它接受一个字符串并将其添加到内存中的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文件时,位图的大小是否正确定义,背景为白色,但是它们没有文本?

我做错了什么?

2 个答案:

答案 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)

您似乎正在中途交换位图。您似乎正在执行以下操作:

  1. 创建位图
  2. 获取位图的图形句柄
  3. 创建一个不同大小的新位图
  4. 问题是你仍在使用与旧(第一个)位图相关联的图形句柄(来自第2步),而不是新的(第二个)位图。

    您需要使用与新(第二)位图关联的图形句柄,而不是旧的(第一个)位图。