0

我一直在使用 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。这正常吗?我在哪里失踪?

4

2 回答 2

1

.NETImage类用作两种图像的接口:Bitmap图像和Metafile图像。后者由一系列用于绘制某些东西的指令组成,而不是像位图这样的像素数组。如果您看一下Bitmap 类本身,就会发现有一对LockBits方法可以让您提取图像的像素数据。在Bitmap该类的链接参考的底部,甚至还有一个如何执行此操作的示例。

于 2012-04-30T19:10:02.740 回答
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;
    }
于 2018-01-05T09:18:20.100 回答