40px x 40px 인 비트 맵 개체가 있습니다. 이미지의 모든 단일 픽셀을 반복 할 수 있기를 바랍니다.이미지의 모든 점을 순환합니다. C#
E.g. 1,1
1,2
1,3
...
2,1
2,4
...
39,1
39,2
and so on
이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
40px x 40px 인 비트 맵 개체가 있습니다. 이미지의 모든 단일 픽셀을 반복 할 수 있기를 바랍니다.이미지의 모든 점을 순환합니다. C#
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));
}
}
각 픽셀에 대해 GetPixel을 별도로 사용하는 것은 정말로 느립니다. 이 메서드는 한 번에 한 픽셀 만 원한다면 사용해야합니다. – SimpleVar
예.이 작업을보다 효율적으로 수행 할 수있는 몇 가지 방법이 있습니다. 이것은 단지 가장 단순한 (그리고 가장 느린) 방법 일뿐입니다. 질문에 대한 의견보기 : - "어떤 식 으로든". –
다음은 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;
}
또한 이미지가 24 비트 색상 인 RGB라고 가정합니다. 이미지에 다른 형식이 있으면 실패합니다. –
@JimMischel - 맞아요. 이미지에 알파 정보가 포함 된 경우 getPixel 메서드가이를 고려하지 않으므로 어떤 결과가 발생할지 잘 모르겠습니다. –
가장 좋은 방법이나 방법을 찾고 계십니까? –
@ L.B 어떤 식 으로든 실제로는 효율적인 것입니다. – user1559618
이것은 진지하게 당신이 구글이 될 수있는 것이지만, 당신을 위해 더 쉽게 만들 것입니다 : 효율적인 x, y 반복을위한'Bitmap.LockData'. – SimpleVar