循环图像像素的最有效方法是什么

时间:2015-04-04 11:33:47

标签: c# image performance loops image-processing

我需要比较每张1280x800的2张图片,而且我太担心效率,因为我必须做同样的操作,包括每秒循环

我可以想到很多方法来循环一个Bitmap对象像素,但我不知道哪个更有效,因为现在我使用简单的for循环但它使用了太多的内存和处理我可以在这一点上负担不起

这里和那里进行一些调整,它所做的只是更少的内存以进行更多处理或反过来

我们非常感谢任何提示,信息或经验,如果效率更高,我也可以使用外部库。

1 个答案:

答案 0 :(得分:2)

来自https://stackoverflow.com/a/6094092/1856345

Bitmap bmp = new Bitmap("SomeImage");

// Lock the bitmap's bits.  
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;

// Declare an array to hold the bytes of the bitmap.
int bytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[bytes];
byte[] r = new byte[bytes / 3];
byte[] g = new byte[bytes / 3];
byte[] b = new byte[bytes / 3];

// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, bytes);

int count = 0;
int stride = bmpData.Stride;

for (int column = 0; column < bmpData.Height; column++)
{
    for (int row = 0; row < bmpData.Width; row++)
    {
        b[count] = (byte)(rgbValues[(column * stride) + (row * 3)]) 
        g[count] = (byte)(rgbValues[(column * stride) + (row * 3) + 1]);
        r[count++] = (byte)(rgbValues[(column * stride) + (row * 3) + 2]);
    }
}