我目前正在编写一个程序,用于从XML文件创建和填充WPF应用程序中的控件。其中一个功能是用户可以选择他想要在程序中显示的图像。此图像显示在图像控件中。选择图像后,程序会将所有数据保存回XML文件。
图像将被转换并保存如下:
byte[] bytes = new byte[1];
MemoryStream ms = new MemoryStream();
System.Drawing.Image image = new Bitmap(sPathOfImage);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = ms.ToArray();
XElement Image = new XElement("Image", Convert.ToBase64String(bytes));
xDocument.Add(Image);
xDocument.Save("xDocument.xml");
这完美无缺,一切都很好。但是,主问题是XElement Image 的值的长度。即使是40kb的图像,长度也是60,000个标志。对于一个9mb的图像,它需要13,200,000个巨大的标志。现在我正在寻找一种更好的解决方案来将图像存储在XML文件中。
通过规范,它必须在一个XML文件中。
那么,是否有一种很好的方法可以使字符串更小,更合适的流,我错过的任何东西?任何提示都表示赞赏。
答案 0 :(得分:4)
将图像内容填充到XML文件中不会有任何魔力。内容将与原始文件大小成比例。即使压缩文件并将其保存到XML也无济于事,因为有些图像的压缩可能性较低。 出于评估目的,我决定了解Visual Studio如何将图像保存在其资源文件中。结果如下:
...
<data name="_myimage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\myimage.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
停止重新发明轮子也许有意义,并相信专业人士? :)
答案 1 :(得分:2)
将图像存储到XML文件中:
File.ReadAllBytes()
将所有字节读入内存。Convert.ToBase64String()
从XML文件中检索图像:
string val = currentXml.Element("image").Value;
byte[] bytes = Convert.FromBase64String(val);
MemoryStream mem = new MemoryStream(bytes);
Bitmap bmp2 = new Bitmap(mem);