2012-11-02 3 views
-2

40px x 40px 인 비트 맵 개체가 있습니다. 이미지의 모든 단일 픽셀을 반복 할 수 있기를 바랍니다.이미지의 모든 점을 순환합니다. C#

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

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

가장 좋은 방법이나 방법을 찾고 계십니까? –

+0

@ L.B 어떤 식 으로든 실제로는 효율적인 것입니다. – user1559618

+2

이것은 진지하게 당신이 구글이 될 수있는 것이지만, 당신을 위해 더 쉽게 만들 것입니다 : 효율적인 x, y 반복을위한'Bitmap.LockData'. – SimpleVar

답변

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

각 픽셀에 대해 GetPixel을 별도로 사용하는 것은 정말로 느립니다. 이 메서드는 한 번에 한 픽셀 만 원한다면 사용해야합니다. – SimpleVar

+0

예.이 작업을보다 효율적으로 수행 할 수있는 몇 가지 방법이 있습니다. 이것은 단지 가장 단순한 (그리고 가장 느린) 방법 일뿐입니다. 질문에 대한 의견보기 : - "어떤 식 으로든". –

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; 
} 
+0

또한 이미지가 24 비트 색상 인 RGB라고 가정합니다. 이미지에 다른 형식이 있으면 실패합니다. –

+0

@JimMischel - 맞아요. 이미지에 알파 정보가 포함 된 경우 getPixel 메서드가이를 고려하지 않으므로 어떤 결과가 발생할지 잘 모르겠습니다. –

관련 문제