【问题标题】:How can I get a more compact serialization of an image?如何获得更紧凑的图像序列化?
【发布时间】:2010-09-09 08:05:57
【问题描述】:

我正在序列化c#.net 中的JPEG 图像。我只是将其转换为字节流并通过 Web 服务发送。

我观察到序列化的字节流是实际图像大小的 30 倍。谁能建议我一种更好的方法来序列化并保持相对于实际图像的大小?

【问题讨论】:

  • 你是如何观察到再见流大 30 倍的?

标签: .net web-services serialization


【解决方案1】:

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

【讨论】:

  • @Indeera,如果您将 JPEG 文件作为图像读取,它将在内存中未压缩。例如,Windows 示例图像 Tulips.jpg 在磁盘上为 620K,在内存中为 2359K。根据创建 JPEG 时应用的压缩参数以及未压缩图像是否具有 Alpha 通道,差异可能远大于此。毕竟这就是压缩的重点。
【解决方案2】:
  1. 您需要使用 FileStream 读取原始图像流,然后使用 MemoryStream 将其传递给 Serializer。
  2. 如果您只能使用 Image 类,请尝试指定您接收的字节数组的输出格式。

【讨论】:

    【解决方案3】:

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

    MSDN:

    Large Data and Streaming

    【讨论】:

      【解决方案4】:

      免责声明:不知情的人发言
      它是开放性/标准和性能之间的权衡。也许您正在使用诸如 SOAP 之类的东西,它会向数据包中添加大量协议开销字节。如果大小是一个重要的约束,请尝试将其作为纯二进制流发送...实际语法也许其他人可以加入。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            为什么不将其转换为 Base64String?

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

            另一方面,您可以通过以下方式将其更改回字节[]:

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

            【讨论】:

            • 不要那样做——添加另一层编码只会增加大小。
            猜你喜欢
            • 2021-07-01
            • 2023-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-15
            • 2010-10-07
            • 1970-01-01
            相关资源
            最近更新 更多