【问题标题】:how to convert Image to string the most efficient way?如何以最有效的方式将图像转换为字符串?
【发布时间】:2011-08-19 08:25:23
【问题描述】:

我想将图像文件转换为字符串。以下作品:

MemoryStream ms = new MemoryStream();

Image1.Save(ms, ImageFormat.Jpeg);

byte[] picture = ms.ToArray();
string formmattedPic = Convert.ToBase64String(picture);

但是,将其保存到 XmlWriter 时,需要很长时间才能保存(26k 图像文件需要 20 秒)。有没有办法加快这个动作?

谢谢,

拉克斯

【问题讨论】:

  • 好吧,ToArray() 复制了内存流的缓冲区。您可以改用 GetBuffer() 方法来节省分配时间。
  • @Inuyasha:不——你不能因为 GetBuffer(参见 MSDN)返回的字节数(未初始化)可能比当前流中的字节数多!
  • @yahia:这就是为什么您检查流的 Length 属性,并且不要读取缓冲区中的那个点。如果他调用 ToArray(),它会创建一个副本。

标签: c# image byte streamreader memorystream


【解决方案1】:

您在三点处不必要地进行大型操作:

  1. 获取流的字节
  2. 将其转换为 Base64
  3. 将其写入 XmlWriter。

相反。首先致电LengthGetBuffer。这让您可以直接对流的缓冲区进行操作。 (不过,请先冲洗它)。

然后,自己实现 base-64。它相对简单,因为您采用 3 个字节为一组,进行一些位旋转以获取将要转换为的字符的索引,然后输出该字符。在最后,您根据发送的最后一个块中的字节数添加一些 = 符号(= 用于一个剩余字节,== 用于两个剩余字节,如果没有部分块则没有)。

把这个写入一个字符缓冲区(一个字符[])。最有效的大小是实验的问题,但我会从 2048 个字符开始。填满缓冲区后,在其上调用 XmlWriter.WriteRaw,然后再次从索引 0 处开始写回。

这样,您可以减少分配,并且从将图像加载到内存流的那一刻起就开始输出。一般来说,这应该会带来更好的吞吐量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2018-06-10
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多