在C#中将位图转换为2D字节数组?

时间:2012-04-30 19:01:45

标签: c# arrays image 2d

我一直在使用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中。这是正常的吗?我在哪里错过了?

2 个答案:

答案 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;
    }