2015-03-02 59 views
1

我想将文本文件的内容转换为使用C#的图像,但似乎无法做到。我从System.Drawing得到了令人讨厌的A generic error occurred in GDI+.错误。将文本文件内容保存为图像

这里是我的实际代码:

public static Bitmap ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height) 
{ 
    Bitmap bmp = new Bitmap(width, Height); 
    using (Graphics graphics = Graphics.FromImage(bmp)) 
    { 
     Font font = new Font(fontname, fontsize); 
     graphics.FillRectangle(new SolidBrush(bgcolor), 0, 0, bmp.Width, bmp.Height); 
     graphics.DrawString(txt, font, new SolidBrush(fcolor), 0, 0); 
     graphics.Flush(); 
     font.Dispose(); 
     graphics.Dispose(); 
    } 
    bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp"); 
    Convert(bmp); 
    return bmp; 
} 

所以在该行bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp");当我尝试保存图像,它带来的这个错误。我阅读了帖子和类似的问题,并按照多个来源的建议围绕着using声明包裹了所有内容,但我仍然错过了一些东西,无法弄清楚。

我用File.ReadAllText(path);阅读文本文件的内容,然后我把我的方法通常呼叫:

ConvertTextToImage(content, "Bookman Old Style", 10, Color.White, Color.Black, width, height); 
+1

由于试图保存到C:的根目录,您可能会遇到该错误。尝试将Save()方法中的文件路径更改为类似于C:\ Temp \ .bmp的文件路径。这与权限/ UAC不允许你直接写入根目录 – 2015-03-02 16:00:12

+0

我试过了,但我仍然得到相同的通用错误...我也尝试保存到项目的当前目录 - 同样的事情。我认为这里的位置不是原因。 – lapadets 2015-03-02 16:02:19

+0

我刚刚测试了你的代码。写入C:\抛出通用错误,写入C:\ Temp \成功。您的代码按原样运行。 – 2015-03-02 16:03:57

回答

0

由于UAC,你所得到的一般错误,因为你正在试图写入到C盘根目录:驱动器,这是不是在Windows中不允许。

更改线路

bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp"); 

bmp.Save("C:\\Temp\\" + Guid.NewGuid().ToString() + ".bmp"); 

(或您具有权限的任何其他文件夹),允许成功创建图像的。

+0

是的,事实证明我需要以管理员身份运行VS ...我尝试写入'C:\'上的另一个文件夹,但那不起作用,所以我最初放弃了维权理念。 – lapadets 2015-03-02 16:13:08

+0

我会反对以管理员身份运行VS。而是写入AppData文件夹以获取临时存储或另一个预定义的文件夹,具体取决于应用程序对图像的处理方式。您的用户可能并不总是有权以管理员身份运行该应用程序 – 2015-03-02 16:14:52

3

所以,你Dispose()荷兰国际集团的Graphics对象两次。一旦通过您的线路说graphics.Dispose()和一旦通过using构造自动完成。您应该罚款写成这样的方法:

public static Bitmap ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height) 
{ 
    var bmp = new Bitmap(width, Height); 

    using (var graphics = Graphics.FromImage(bmp)) 
    using (var font = new Font(fontname, fontsize)) 
    { 
     graphics.FillRectangle(new SolidBrush(bgcolor), 0, 0, bmp.Width, bmp.Height); 
     graphics.DrawString(txt, font, new SolidBrush(fcolor), 0, 0); 
    } 

    bmp.Save("C:\\" + Guid.NewGuid() + ".bmp"); 
    Convert(bmp); 
    return bmp; 
} 
+1

看来您的更改没有解决原始错误? – swe 2015-03-02 16:07:21

+0

我不明白我的更改。 – 2015-03-02 16:08:11

+0

但是双重配置不应该以错误结束,特别是不在GDI + -Error中?这将是一个NullRef ... – swe 2015-03-02 16:09:43

0

我认为你的应用没有权限在C:/上写文件。 A已经修改了你的代码,这对我有用:

bmp.Save(Guid.NewGuid().ToString() + ".bmp"); 

它会将图像保存在你的应用程序文件夹中。

此外,您不必拨打graphics.Dispose();,因为using可以帮您。