将图像高效地存储在XML文件中

本文关键字:XML 文件 存储 图像 高效 | 更新日期: 2024-10-22 08:15:14

我目前正在编写一个程序,该程序从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图像的值的长度。即使是40kb的图像,长度也是60000个标志。对于一个9毫米的图像,它需要13200000个巨大的标志。现在,我正在寻找一种更好的方法来将图像存储在XML文件中。

通过规范,它必须在一个XML文件中。

那么,有没有一个好的方法可以让绳子变小,更合适的流,我错过了什么?任何提示都将不胜感激。

将图像高效地存储在XML文件中

将图像内容填充到XML文件中不会有什么神奇之处。内容将与原始文件大小成比例。即使压缩文件并将其保存到XML也无济于事,因为有些图像压缩的可能性较低。出于评估目的,我决定了解VisualStudio如何将图像保存在其资源文件中。结果如下:

  • VS将图像放在Resource文件夹下
  • 在Resource.resx中放置对图像的引用

  <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>

也许停止重新发明轮子,相信专业人士会有意义吗?:)

将图像存储到XML文件中:

  1. 使用File.ReadAllBytes()将所有字节读入内存
  2. 使用Convert.ToBase64String()将字节转换为Base64字符串
  3. 将Base64编码字符串写入元素内容

要从XML文件中检索图像:

 string val = currentXml.Element("image").Value; 
 byte[] bytes = Convert.FromBase64String(val); 
 MemoryStream mem = new MemoryStream(bytes); 
 Bitmap bmp2 = new Bitmap(mem);