循环遍历图像的所有点C#

时间:2012-11-02 21:22:46

标签: c# .net windows

我有一个位图对象,它是40像素×40像素。我希望能够遍历图像中的每个像素。

E.g. 1,1
1,2
1,3
...
2,1
2,4
...
39,1
39,2
and so on

实现这一目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

或许这样的事情。请注意,如果我没有弄错的话,有较新的(System.Windows.Media)Bitmap和较旧的(System.Drawing)BitmapImage类,这些行为可能略有不同。

Bitmap bmp = ...  // Get bitmap
for(int x=0; x<bmp.PixelWidth; x++)
{
    for(int y=0; y<bmp.PixelHeight; y++)
    {
        Color c = bmp.GetPixel(x,y);
        Console.WriteLine(string.Format("Color at ({0},{1}) is {2}", x, y, c));
    }
}

答案 1 :(得分:1)

这是一个使用LockBits的方法。但它使用了一个不安全的代码块:

private void processPixels()
{
    Bitmap bmp = null;
    using (FileStream fs = new FileStream(@"C:\folder\SomeFileName.png", FileMode.Open))
    {
        bmp = (Bitmap)Image.FromStream(fs);
    }

    BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);

    for (int i = 0; i < bmp.Height; i++)
    {
        for (int j = 0; j < bmp.Width; j++)
        {
            Color c = getPixel(bmd, j, i);

            //Do something with pixel here
        }
    }

    bmp.UnlockBits(bmd);
}

private Color getPixel(BitmapData bmd, int x, int y)
{
    Color result;

    unsafe
    {
        byte* pixel1 = (byte*)bmd.Scan0 + (y * bmd.Stride) + (x * 3);
        byte* pixel2 = (byte*)bmd.Scan0 + (y * bmd.Stride) + ((x * 3) + 1);
        byte* pixel3 = (byte*)bmd.Scan0 + (y * bmd.Stride) + ((x * 3) + 2);

        result = Color.FromArgb(*pixel3, *pixel2, *pixel1);
    }

    return result;
}