2017-01-09 1 views
-3

그레이 스케일로 변환하려고 시도했지만 아래의 코드를 사용하여 16bpp 회색 음영 이미지를 얻는 방법은 16bpp 이 아닙니다.C#에서 16bpp 이미지로 32bpp 이미지를 변환하는 방법? (그레이 스케일)

for (int y = 0; y < tr.Height; y++) 
     { 
      for (int x = 0; x < tr.Width; x++) 
      { 
       //get pixel value 
       p = tr.GetPixel(x, y); 

       //extract pixel component ARGB 
       int a = p.A; 
       int r = p.R; 
       int g = p.G; 
       int b = p.B; 

       //find average 
       int avg = (r + g + b)/3; 

       //set new pixel value 
       tr.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg)); 
      } 
     } 
+0

'tr'이란 정확히 무엇입니까? – devRicher

+4

매우 혼란 스럽습니다 - 이미지가 컬러 32bpp와 그레이 스케일 16bpp 형식이 될 것으로 기대하는 코드처럼 보입니다 ... 아직 시도되지 않은 코드가 아닌 실제 [MCVE]를 제공했는지 확인하십시오. –

답변

0

여기서는 픽셀 형식을 변경하지 않고 색상 만 변경하고 있습니다. 계산 한 평균은 0에서 255 사이의 값을 가지며 스틸 RGBA 이미지의 각 채널을 해당 숫자로 설정합니다. 계산 된 평균에서 더 많은 해상도를 얻으려면 합계를하기 전에 각 채널에 256을 곱하십시오. 그런 다음 계산 한 평균은 0에서 65535 사이입니다. 그러나 원래 값인 Bitmap (RGBA 형식)이 아니라 PixelFormatFormat16bppGrayScaleBitmap에이 값을 저장하려고합니다.

...하지만 어쨌든 어디 까지나 (정확히 어디에서 잊어 버린) Bitmap을 진정한 회색조 형식으로 저장할 방법이 없다는 것을 알게 될 것이기 때문에 이것은 쓸데 없다는 것을 경고해야합니다. 항상 RGB 또는 색인이 생성됩니다. 내가 이해하는 한, 이것은 GDI +의 제한 사항입니다. 더 자세한 정보를 원하시면 손가락을 건 드리면 Hans Passant가 귀하의 질문에 대해 언급 할 것입니다. 그가 문제를 설명하는 질문에 대한 링크를 찾으려고 노력할 것입니다.

아, 또한 R, G 및 B 채널을 평균하는 것이 색상을 회색 음영으로 변환하는 "올바른"방법이 아니라고 추가해야합니다. 자세한 내용은 this question을 참조하십시오.

그리고 당신은 GetPixelSetPixel 천천히, 그리고 많은 양의 데이터를 설정이 LockBitsUnlockBits를 사용하도록 권장하는 것이, 다른 곳에서 그것을 읽을하지 않은 경우에 나는, 내가 더주의해야한다 같아요.

관련 문제