2015-03-02 78 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可以幫您。