C# 循环浏览图像C的所有点#

C# 循环浏览图像C的所有点#,c#,.net,windows,C#,.net,Windows,我有一个位图对象,它是40px乘40px。我希望能够循环通过图像中的每一个像素 E.g. 1,1 1,2 1,3 ... 2,1 2,4 ... 39,1 39,2 and so on 实现这一目标的最佳方法是什么?也许是这样的。请注意,如果我没有弄错的话,有较新的(System.Windows.Media)Bitmap和较旧的(System.Drawing)BitmapImage类,它们的行为可能略有不同 Bitmap bmp = ... // Get bitmap for(int x=0

我有一个位图对象,它是40px乘40px。我希望能够循环通过图像中的每一个像素

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

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

也许是这样的。请注意,如果我没有弄错的话,有较新的(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));
    }
}
位图bmp=…/获取位图
对于(int x=0;x这里有一个使用锁位的方法。它使用不安全的代码块,但是:

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;
}
private void processPixels()
{
位图bmp=null;
使用(FileStream fs=newfilestream(@“C:\folder\SomeFileName.png”,FileMode.Open))
{
bmp=(位图)Image.FromStream(fs);
}
BitmapData bmd=bmp.LockBits(新矩形(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadOnly,bmp.PixelFormat);
对于(int i=0;i
你是在寻找最好的方法还是任何方法?@L.B确实是任何方法,但也是一种有效的方法这是你可以用谷歌搜索的东西,但我会让你更容易:
Bitmap.LockData
用于有效的x、y迭代。对每个像素单独使用GetPixel非常慢。只有当你想要一个像素a时才应该使用这种方法是的,有几种方法可以更有效地做到这一点。这只是一种最简单(也是最慢)的方法。请参阅对问题的评论:-“任何方法都可以”。这还假设图像是24位颜色,RGB。如果图像有任何其他格式,它将失败。@JimMischel-对,我不确定如果图像包含任何alpha信息会发生什么,因为getPixel方法也没有考虑到这一点。