将位图转换为颜色[]

时间:2016-01-05 02:08:35

标签: c# arrays bitmap

我想要转换为颜色数组的位图,比使用GetPixel函数更快。

到目前为止,我看到人们首先将位图转换为字节数组,然后转换为颜色数组:

Bitmap bmBit = (Bitmap)bit;

var bitmapData = bmBit.LockBits(new Rectangle(0, 0, bmBit.Width, bmBit.Height),
        ImageLockMode.ReadWrite, bmBit.PixelFormat);
var length = bitmapData.Stride * bitmapData.Height;
byte[] bytes = new byte[length];
Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
bmBit.UnlockBits(bitmapData);

但是这会返回一个数字不正确的bmBit。 我做错了什么,有没有更好的方法来做到这一点而不先转换为字节数组?

1 个答案:

答案 0 :(得分:0)

像素存储在位图中的方式有​​多种(16色,256色,每像素24位等),行填充为4个字节的倍数。

for (int i = 0; i < bitmapData.Height; i++)
{
    //the row starts at (i * bitmapData.Stride).
    //we must do this because bitmapData.Stride includes the pad bytes.
    int rowStart = i * bitmapData.Stride;        

    //you need to use bitmapData.Width and bitmapData.PixelFormat
    //  to determine how to parse a row. 

    //assuming 24 bit. (bitmapData.PixelFormat == Format24bppRgb)
    if (bitmapData.PixelFormat == PixelFormat.Format24bppRgb)
    {
        for (int j = 0; j < bitmapData.Width; j++)
        {
            //the pixel is contained in:
            //    bytes[pixelStart] .. bytes[pixelStart + 2];
            int pixelStart = rowStart + j * 3;
        }
    }
}