【问题标题】:ImageConverter byte aImageConverter 字节 a
【发布时间】:2013-09-28 08:51:31
【问题描述】:

我正在尝试将灰度图像转换为字节数组。我使用以下代码。但是,生成的字节数组不是逻辑大小。

ImageConverter converter = new ImageConverter();
byte[] test = (byte[])converter.ConvertTo(gpuMatch.Bitmap,typeof(byte[]));

图像是灰度 792x410 8 位深度。那么数组大小不应该是 324720 字节吗?我在字节数组中得到了接近 140122 个元素。

ImageConverter ic = new ImageConverter();
Image img = (Image)ic.ConvertFrom(test);

如果我将字节重新转换为图像,则图像是完整的。有人可以解释一下为什么会出现这种不匹配吗?

谢谢 坎南

【问题讨论】:

  • 也许您应该告诉您的听众我们使用的是什么编程语言以及您使用的是什么 ImageConverter?
  • 我很抱歉。我使用 VS2010、C#、.net4.0。和类 system.Drawing.ImageConverter

标签: c# .net bytearray grayscale color-depth


【解决方案1】:

返回的字节数组不是图像的原始表示,其中一个字节代表一个像素。相反这取决于图像格式。所以你会得到 jpeg、gif、png 等不同的结果。

我认为这个链接会很有用:

http://www.vcskicks.com/image-to-byte.php

(取自这个答案:Convert a bitmap into a byte array

链接页面如下:

关于 ImageConverter 要记住的一点是,图像将直接转换为字节。因此,bmp 格式的图像和 png 格式的相同图像将不会具有相同的字节数组。因此,例如,如果您想比较两个图像,则必须先确保它们的格式相同,然后再比较它们的字节数组。

所以我想你会注意到,字节数组的大小总是与你读入的图像文件大致相同。

【讨论】:

  • 让我想知道ImageConverter 有什么可能比Image.Save(memstream, format) 更好,或者,见鬼,File.ReadAllBytes(path)
【解决方案2】:

当我使用流方法时,我得到了实际的十六进制数据。显然,图像转换器在字节转换过程中使用图像类型(默认为 PNG?)。因此字节数组大小不匹配。

感谢您的支持, 坎南

【讨论】:

    【解决方案3】:

    创建位图时,会发生一些优化。您会发现图像中可能定义了一个全局调色板,可以在整个图像中重复使用。这意味着它不会重写整个文件的颜色字节值 - 导致写入的字节更少。

    谢谢, 戴夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2015-01-16
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      相关资源
      最近更新 更多