如何以最高效的方式将图像转换为字符串?

3
我希望将一个图像文件转换为字符串。以下方法可行:
MemoryStream ms = new MemoryStream();

Image1.Save(ms, ImageFormat.Jpeg);

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

然而,当将此保存到 XmlWriter 时,保存时间很长(26k 图像文件需要20秒)。有没有方法可以加速此操作?

谢谢,

Raks


ToArray() 方法会复制 MemoryStream 缓冲区的内容。你可以使用 GetBuffer() 方法来避免分配时间的浪费。 - user47589
1
@Inuyasha:不行 - 你不能这样做,因为GetBuffer(参见MSDN)返回的可能比流中存在的字节数(未初始化)多! - Yahia
@yahia:这就是为什么要检查流的Length属性,而不要在缓冲区中读取超过该点的内容。如果他调用ToArray(),它会复制一份。 - user47589
1个回答

1

你在三个地方进行了不必要的大型操作:

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

相反,先调用LengthGetBuffer。 这使您可以直接操作流的缓冲区。 (但记得先刷新它)。

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

将其写入char缓冲区(char [])。 最有效的大小是一个可以通过实验确定的问题,但我会从2048个字符开始。 当填充缓冲区时,在其中调用XmlWriter.WriteRaw,然后再从索引0开始写入。

这样做可以减少分配内存的次数,同时在图像加载到内存流中后就可以开始输出了。通常情况下,这会提高吞吐量。


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