Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将图像高效地存储在XML文件中_C#_Xml_Wpf_Image_Compression - Fatal编程技术网

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

C# 将图像高效地存储在XML文件中,c#,xml,wpf,image,compression,C#,Xml,Wpf,Image,Compression,我目前正在编写一个程序,从XML文件在WPF应用程序中创建和填充控件。其中一个特点是,用户可以选择要在程序中显示的图像。此图像显示在图像控件中。选择图像后,程序将所有数据保存回XML文件 图像的转换和保存方式如下: byte[] bytes = new byte[1]; MemoryStream ms = new MemoryStream(); System.Drawing.Image image = new Bitmap(sPathOfImage); image.Save(ms, Syste

我目前正在编写一个程序,从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");
这很好,一切都很好。然而,主要的问题是像素图像的值的长度。即使对于40kb的图像,长度也是60000个符号。对于9mb的图像,它需要13200000个巨大的标志。现在我正在寻找一种更好的解决方案,将图像存储在XML文件中

通过规范,它必须位于一个XML文件中


那么,有没有一个好方法可以使字符串更小,更适合流,我遗漏了什么?任何暗示都将不胜感激

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

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


参考资料\myimage.jpg;System.Drawing.Bitmap,System.Drawing,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a

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

将图像存储到XML文件中:

  • 使用
    File.ReadAllBytes()
    将所有字节读入内存
  • 使用
    Convert.ToBase64String()
  • 将Base64编码字符串写入元素内容
  • 从XML文件检索图像:

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

    使用不同的格式,不是
    BMP
    ,而是
    JPEG
    。这会节省很多。如果图像已经压缩,我认为您将无法将字符串缩短很多。您可以将“符号”分成几个块。必须将图像文件保存在XML中。在XML中保留文件的相对路径或URL并将文件与XML一起分发是不够的?请注意,示例代码的第一行是完全冗余的。你可以写
    byte[]bytes=ms.ToArray()
    @synched一个写下要求将一个9 MB大小的图像文件存储在XML文件中的人完全不知道他在说什么。这个要求是胡说八道的,必须认真修改。哈哈,谢谢你的努力,我猜这是最后的证据了D由于我找不到任何其他/更好的解决方案,我将接受这一点。这是无可奈何的。
     string val = currentXml.Element("image").Value; 
     byte[] bytes = Convert.FromBase64String(val); 
     MemoryStream mem = new MemoryStream(bytes); 
     Bitmap bmp2 = new Bitmap(mem);