2016-11-18 31 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

相关问题