我一直在使用AForge.NET框架开发一个项目。在我的项目中,我一直在尝试从灰度位图中获取2D字节数组。在本网站和其他论坛上发布了一些关于此主题的解决方案。但我没有得到真正的结果。例如,我使用了那段代码:
public static byte[] ImageToByte2(Image img)
{
byte[] byteArray = new byte[0];
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Close();
byteArray = stream.ToArray();
}
return byteArray;
}
在这个“MemoryStream”方法之后,我考虑过将这个字节数组转换成2D。但是,当我使用4 * 8位图测试此代码示例时,它会将1100个值返回到byteArray中。这是正常的吗?我在哪里错过了?
答案 0 :(得分:1)
.NET Image
类充当两种类型图像的界面:Bitmap
图像和Metafile
图像。后者包含一系列绘制内容的指令,而不是像位图一样的像素数组。如果您查看Bitmap class itself,可以使用一对LockBits
方法来提取图像的像素数据。在Bitmap
类的链接引用的底部,甚至还有一个如何执行此操作的示例。
答案 1 :(得分:1)
请使用以下方法
public static byte[,] ImageTo2DByteArray(Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;
BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
byte[] bytes = new byte[height * data.Stride];
try
{
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);
}
finally
{
bmp.UnlockBits(data);
}
byte[,] result = new byte[height, width];
for (int y = 0; y < height; ++y)
for (int x = 0; x < width; ++x)
{
int offset = y * data.Stride + x * 3;
result[y, x] = (byte)((bytes[offset + 0] + bytes[offset + 1] + bytes[offset + 2]) / 3);
}
return result;
}