【问题标题】:Image creation from memory stream size inconsistency从内存流大小不一致创建图像
【发布时间】:2011-11-30 08:53:50
【问题描述】:

我正在从内存流中创建一个“gif”图像。我有 43 字节的内存流。当我从这个流创建图像时,我得到一个 70 字节的图像。可能是什么问题?这是我创建图像的代码:

Bitmap httpimage2 = new Bitmap(ms, true);           // ms: 43 bytes memory stream
httpimage2.Save(@"D:\sample.gif", ImageFormat.Gif); // httpimage2: 70 bytes image

【问题讨论】:

  • 内存数据大小和磁盘数据大小并不总是100%相同,内存流是否已经包含二进制数据作为gif?也可能是 Bitmap.Save 方法压缩或使用某些特定的 GIF 格式,而不是 100% 与您最初在内存流中的相同。它仍然有效吗?你能打开和使用保存在磁盘上的图像吗?

标签: c# .net image bitmap


【解决方案1】:

我不是专家,这可能是因为第二张图片是用更大的调色板存储的。图像在像素上是否相同?

编辑:另请注意,框架对图像的编码可能与原始图像的创建方式不同。

【讨论】:

    【解决方案2】:

    它们是不同的格式,那么为什么它们的大小相同?

    This 提供了有关 bmp 格式的详细信息,并指出内存中的格式将不包含 14 字节的位图文件头,这是造成一些差异的原因。

    This 提供有关 GIF 格式的详细信息。

    一般来说,可以对在内存中表示图像的字节进行一些假设,因为您可能不需要文件中的任何内容来指示有关图像元数据的任何内容,因为此元数据可能隐含在类中有字节作为表示。例如,GIF 有一个固定长度的标头,指示格式,87a 或 89a。这在内存中可能不是必需的,因为您可能有不同的类,它们只包含代表图像的字节,一类是 87a 的图像,一类是 89a 的图像。现在内存中的图像可以更小,因为您不需要文件中关于它是哪种格式的信息,因为这仅在读取 hte 文件时需要,并且用于决定要实例化哪个类

    由于格式不同,它们将需要不同数量的信息来编码相同的图像。

    如果您将图像作为位图保存到磁盘,您可能会发现图像的大小更相似,但它们可能仍然是不同的大小,如果它们的大小相同,那只是巧合。

    【讨论】:

    • 这更多是为了评论而不是答案 ;-)
    • @DavidePiras 我在提供信息的同时扩展了我的答案,但就其本身而言,你是对的,第一行只适合作为评论
    【解决方案3】:

    尝试为图像保存调色板和 bitsPerPixel 并在创建时使用它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2018-01-15
      • 2012-11-25
      相关资源
      最近更新 更多