我想要转换为颜色数组的位图,比使用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。 我做错了什么,有没有更好的方法来做到这一点而不先转换为字节数组?
答案 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;
}
}
}