2013-03-28 2 views
1

System.Drawing.Bitmap의 알파 채널에서 그레이 스케일 비트 맵을 생성해야합니다.비트 맵에서 알파 채널의 마스크 생성

GetPixel 및 SetPixel을 사용해 보았지만 PixelFormat이 Format16bppGrayScale 인 비트 맵에서는 작동하지 않습니다.

예를 들어 내 회색 음영 이미지의 모든 픽셀을 검은 색으로 설정하십시오. SetPixel이 예외를 throw합니다.

var bitmap = new Bitmap(16, 16, PixelFormat.Format16bppGrayScale); 
for (int x = 0; x < bitmap.Width; x++) 
{ 
    for (int y = 0; y < bitmap.Height; y++) 
    { 
     bitmap.SetPixel(x,y, Color.Black); 
    } 
} 
+1

수있다 코드를 표시하고 16bppGrayScale 이미지에서 작동하지 않는 부분을 지적하십시오. – JMK

답변

1

할 수 있습니다 사용의 BitmapData bitmapDataIn = bitmap.LockBits (...) 다음 사용 바이트 * pDataIn = (바이트 *) bitmapDataIn.Scan0를 사용; 원시 비트 맵 데이터에 대한 포인터를 얻습니다.

이 수정하거나 포인터

와 픽셀 값을 읽을 수 있습니다

pDataIn[y * iStrideSize + x * 4 + 0] //Blue 
pDataIn[y * iStrideSize + x * 4 + 1] //Greed 
pDataIn[y * iStrideSize + x * 4 + 2] //Red 
pDataIn[y * iStrideSize + x * 4 + 3] //Alpha 

하지만, 32 비트 비트 맵 데이터입니다이 내 코드의 복사 - 붙여 넣기,

unsafe 
      { 
       byte* pDataIn = (byte*)bitmapDataIn.Scan0; 
       int iStrideSize = bitmapDataIn.Stride; //one row size in bytes, iWidth * 4 
       int y, x; 
       byte B, G, R, A; 

       for (y = 0; y < iHeight; y++) 
       { 
        for (x = 0; x < iWidth; x++) 
        { 
         B = pDataIn[y * iStrideSize + x * 4 + 0]; 
         G = pDataIn[y * iStrideSize + x * 4 + 1]; 
         R = pDataIn[y * iStrideSize + x * 4 + 2]; 
         A = pDataIn[y * iStrideSize + x * 4 + 3]; 

        } 
       } 


       bitmap.UnlockBits(bitmapDataIn); 
      } 
관련 문제