【问题标题】:C# Image Class to Byte Array Length IssuesC# 图像类到字节数组长度问题
【发布时间】:2013-12-24 03:10:39
【问题描述】:

我使用 C# 的 Image 类读取文件:

var image = Image.FromFile(filePath);

这意味着image 已被图像数据填充。

我现在将此图像转换为字节数组:

static byte[] ImageToByteArray(Image imageIn)
{
    var ms = new MemoryStream();
    imageIn.Save(ms, ImageFormat.Bmp);
    return ms.ToArray();
}

现在我想把这个 Byte 数组转换成矩阵数组,二维字节数组:

var imageMatrix = byte[image.Height, image.Width];

当我执行一个 for 循环将值移动到新的字节矩阵中时,我得到一个 IndexOutOfRangeException

在检查中,

var isImageLengthSameAsByteLength = imageByteArray.Length == (image.Width * image.Height);

isImageLengthSameAsByteLength值为false,查看值后数组长度为132442,(width * height)为130995。

因此,这些之间显然存在一些差异。我认为图像字节数组中已经编码了一些额外的东西,因为显然heightwidth 告诉你图像的大小。

任何想法,谢谢,

【问题讨论】:

  • 图像通常在 4 字节边界(或类似)上对齐
  • 每个像素对应 4 个字节,因此您的 byte 数组大小实际上应该是 width*height 的 4 倍。
  • @KingKing:我不明白你为什么会假设 - Save 方法使用你告诉它的任何文件格式,所以它取决于 BMP 文件格式的细节以及什么编码器使用的选项。例如,会有标题信息。
  • @JonSkeet 是的,4字节只是一种流行的情况,实际上我们可以设置图像格式(使用图像的构造函数时)。

标签: c# arrays image


【解决方案1】:

你似乎在假设

imageIn.Save(ms, ImageFormat.Bmp);

每个像素将只写入一个字节。事实上,它会将其存储在BMP format 中——由于标题的原因,它可能更多 每个像素一个字节,而且 BMP 文件中可以有超过 256 种颜色。或者,如果它正在压缩图像,它可能小于每个像素一个字节。

从根本上说,这种到字节数组的转换并不是您想要的——因此您需要找到一种替代方法。如果它实际上是 Bitmap 对象,您可能需要查看 Bitmap.LockBits

【讨论】:

  • 这确实让我的生活有点困难,我基本上是在尝试为 Uni 课程编写自己的压缩算法!
  • @No1_Melman:您可以调查是否有任何 ImageFormat 选项为您提供了可以轻松使用的数据 - 只要您基本上了解 Save 方法的要点。跨度>
  • 我从一个用 C# 编写的 FFT 类中得到了这个函数,它使用了 LockBits,我唯一没有得到的是它开始使用 byte* 并使用 byte*[0] 所以它使它看起来像一个数组,我会在上面写一个问题并在这里链接它!
  • 查看此链接link
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多