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

5

我正在编写一个程序,从XML文件创建和填充WPF应用程序中的控件。其中一个功能是用户可以选择要在程序中显示的图像。该图像显示在Image控件中。选择图像后,程序将所有数据保存回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文件中。
那么,有没有一种好的方法来缩小字符串,使用更适合的流或者其他我可能忽略的东西?任何提示都将不胜感激。

如果图像已经被压缩,我认为你不会能够缩短字符串。你可以将“符号”分成几个块。 - Andrei V
1
需要将图像文件保留在XML中吗?仅在XML中保留相对路径或文件的URL并将文件与XML一起分发是否足够? - Yaugen Vlasau
请注意,您示例代码的第一行完全是多余的。您可以写成 byte[] bytes = ms.ToArray() - Clemens
1
@Synced 如果有人写下一个需求,声称一个大小为9MB的图像文件应该存储在XML文件中,那么他绝对不知道自己在说什么。这个需求是无意义的,必须严肃地改变它。 - Clemens
JPEG格式中,它所占用的字节数肯定不会和BMP格式一样... - Steven Mills
显示剩余5条评论
2个回答

4
没有任何魔法可以将图像内容填入XML文件中。内容将与原始文件大小成比例。即使将文件压缩并保存到XML中也无济于事,因为有些图像可能无法被压缩。 为了评估目的,我决定找出Visual Studio如何在其资源文件中保存图像。结果如下: - VS将图像放置在资源文件夹下 - 在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>

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

哈哈,感谢你的努力,我猜这就是最终的证据了。:D 由于我找不到其他/更好的解决方案,我将接受这个。无可奈何。 - Synn

3

将图像存储到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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接