【发布时间】: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。
因此,这些之间显然存在一些差异。我认为图像字节数组中已经编码了一些额外的东西,因为显然height 和width 告诉你图像的大小。
任何想法,谢谢,
【问题讨论】:
-
图像通常在 4 字节边界(或类似)上对齐
-
每个像素对应 4 个字节,因此您的
byte数组大小实际上应该是width*height的 4 倍。 -
@KingKing:我不明白你为什么会假设 -
Save方法使用你告诉它的任何文件格式,所以它取决于 BMP 文件格式的细节以及什么编码器使用的选项。例如,会有标题信息。 -
@JonSkeet 是的,4字节只是一种流行的情况,实际上我们可以设置图像格式(使用图像的构造函数时)。