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

nei*_*ldt 0 c# image-manipulation bitmap

我有以下代码,它接受一个字符串并将其添加到内存中的Bitmap,而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);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我在Paint中查看BMP文件时,位图的大小是正确定义的,背景是白色的,但是它们不是文本?

我究竟做错了什么 ?

Chr*_*aas 6

您正在创建一个Bitmap对象,然后Graphicsusing语句中将对象绑定到它.但是,然后您销毁该Bitmap对象并创建一个丢失原始绑定的新对象.尝试创建Bitmap一次.

编辑

我看到你试图将这个Graphics对象用于两个目的,一个用于测量事物,另一个用于绘制.这不是一件坏事,但会导致你的问题.我建议您阅读本文中的主题,以获得测量字符串的替代方法.我将使用我个人最喜欢的具体答案中助手类.

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);
Run Code Online (Sandbox Code Playgroud)

  • +1用于发现问题,但是您的示例将无效,因为您在定义之前使用了'oGraphics` (2认同)