我使用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数组转换为矩阵数组,即2d字节数组:
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
显然会告诉你图像的大小。
任何想法,谢谢,
答案 0 :(得分:3)
你似乎在假设
imageIn.Save(ms, ImageFormat.Bmp);
每个像素只写一个字节。实际上,它将它存储在BMP format中 - 由于标题,每个像素可能更多而不是一个字节,并且在BMP文件中可以有超过256种颜色。或者如果它压缩图像,它可能少而不是每个像素一个字节。
从根本上说,这种到字节数组的转换不是你想要的 - 所以你需要设计一种替代方法。如果Bitmap.LockBits
实际上是Bitmap
对象,您可能需要查看{{3}}。