2016-11-18 50 views
-3

以下內容全部來自c#: 我使用各種圖形方法在畫布上繪製(LevelPanel),然後將其保存到XML文件中。我通過將其轉換爲一個字符串,這樣做的:Windows窗體應用程序將字符串轉換爲畫布圖形

private void Save_Click(object sender, EventArgs e) 
    { 
     string filename = FileNameBox.Text; 

     Bitmap bmp = new Bitmap(LevelPanel.Width, LevelPanel.Height); 
     Graphics g = Graphics.FromImage(bmp); 
     Rectangle rect = LevelPanel.RectangleToScreen(LevelPanel.ClientRectangle); 
     g.CopyFromScreen(rect.Location, Point.Empty, LevelPanel.Size); 
     g.Dispose(); 
     string picString = ""; 

     using (MemoryStream m = new MemoryStream()) 
     { 
      bmp.Save(m, ImageFormat.Png); 
      picString = Convert.ToBase64String(m.ToArray()); 
      m.Close(); 
     } 
     File.WriteAllText(@filename, picString); 

    } 

有什麼辦法,我可以加載文件(以字符串,並將其轉換回圖像)。我環顧四周,卻找不到任何東西。任何幫助都會感激不盡。如果這是不可能的,任何人都可以建議將圖像保存/加載爲xml文件的替代方法。

回答

0

如果你只是用節省File.WriteAllText("somefile.xml", picString);

的XML閱讀這樣

string base64String = File.ReadAllText("somefile.xml"); 

的XML讀取XML文件後,你可以通過調用此方法將其轉換回圖像

public static Image ImageFromBase64String(string base64String) 
{ 
    byte[] imageBytes = Convert.FromBase64String(base64String); 

    using (MemoryStream ms = new MemoryStream(imageBytes)) 
    { 
     return new Bitmap(Image.FromStream(ms, true)); 
    } 
} 
+0

謝謝。加載回面板導致系統內存不足,我正在使用LevelPanel.BackgroundImage = Image。像以前一樣編譯好。有任何想法嗎? – CyberRat

+0

更新了這一行的答案'return new Bitmap(Image.FromStream(ms,true));'。但是,除非您使用大圖像,否則內存不足很奇怪,不要忘記在完成使用後丟棄圖像。 –

+0

是的,我忘了處理它們。但我不知道在哪裏放置dispose命令 - 如果在加載後立即使用.Dispose(),它會給我以下錯誤:在System.Drawing.dll中發生未處理的類型爲「System.ArgumentException」的異常,並說該參數無效。 – CyberRat

相關問題