40px x 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));
}
}
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;
}