如何获得更紧凑的图像序列化?

时间:2020-03-05 18:55:11  来源:igfitidea点击:

我正在c#.net中序列化JPEG图像。我只是将其转换为字节流,然后通过Web服务发送。我观察到序列化的字节流是实际图像大小的30倍。有人可以建议我一种更好的方法来序列化并保持相对于实际图像的大小吗?

解决方案

回答

免责声明:非知情人士讲话
在开放性/标准和性能之间进行权衡。如果大小是至关重要的约束条件,请尝试以纯二进制流的形式发送它……其他人可能会使用的实际语法。

回答

JPEG是一种压缩技术,预计一旦我们读入它,它将大大扩展。这是文件格式的本质。尝试找到一种方法来发送原始JPEG文件,而无需先将其读取为图像。

回答

  • 我们需要使用FileStream读取原始图像流,然后使用MemoryStream将其传递给序列化器。
  • 如果只能使用Image类,请尝试指定要接收的字节数组的输出格式。

回答

而且,如果我们通过网络服务发送的图像的大小可能很大,那么也许我们可以看一下MTOM。这是WS- *标准,用于优化带有二进制附件的消息的大小。现在它已经非常集成在Axis2或者Metro for Java或者.NET的堆栈中:

http://msdn.microsoft.com/zh-cn/library/aa528822.aspx(wse 3.0)
http://msdn.microsoft.com/zh-cn/library/ms733742.aspx(wcf)

回答

考虑使用WCF流。我没有注意到通过此服务传输文件的开销。

MSDN:

大数据和流

回答

为什么不将其转换为Base64String?

byte[] arr = File.ReadAllBytes(filename);
string str = Convert.ToBase64String(arr);

在另一端,我们可以通过以下操作将其更改回byte []:

byte[] arr = Convert.FromBase64String(string);

回答

也许只是将图像托管在Web服务器上,然后在Web服务回复中发送URL,而不是序列化的图像。这也将允许客户端在可以的时候在本地缓存图像。