2012-09-26 4 views
0

하나의 1bpp 비트 맵에서 더 작은 1bpp 비트 맵으로 복사 중입니다. 나는 검정 픽셀의 수를 셀 수 있도록 지역을 잘라 내고 싶습니다.비트 맵 너비보다 작은 보폭은 어떻게 얻었습니까?

나는 사본을 만들기 위해 다음을 사용 :

private Bitmap Copy(Bitmap srcBitmap, Rectangle section) 
    { 
     BitmapData SourceLockedData; 
     BitmapData DestLockedData; 
     Rectangle DestRect; 
     byte[] SrcImageData; 
     byte[] DestImageData; 
     int ByteCount; 
     int WidthCount = 0; 
     int CurrentLine = 0; 
     int DestStride; 
     int SrcStride = 0; 

     // Create the new bitmap and associated graphics object 
     Bitmap Newbmp = new Bitmap(section.Width, section.Height, PixelFormat.Format1bppIndexed); 
     Newbmp.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution); 

     //Lock the bits 
     SourceLockedData = srcBitmap.LockBits(section, ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); 

     SrcStride = SourceLockedData.Stride; 

     //Get a count of the number of bytes to copy. Remember, bytes are not pixels. 
     ByteCount = SourceLockedData.Stride * SourceLockedData.Height; 

     //Initialize the source byte array 
     SrcImageData = new byte[ByteCount]; 

     //Copy the data to the source byte array 
     Marshal.Copy(SourceLockedData.Scan0, SrcImageData, 0, ByteCount); 

     //Unlock the bits 
     srcBitmap.UnlockBits(SourceLockedData); 

     //Set a rectangle to the size of the New bitmap 
     DestRect = new Rectangle(new Point(0, 0), Newbmp.Size); 

     //Lock the bits 
     DestLockedData = Newbmp.LockBits(DestRect, ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); 

     DestStride = DestLockedData.Stride; 

     //Get a count of the number of bytes to copy. Remember, bytes are not pixels. 
     ByteCount = DestLockedData.Stride * DestLockedData.Height; 

     //Initialize the source byte array 
     DestImageData = new byte[ByteCount]; 

     //Copy the data to the destination byte array 
     Marshal.Copy(DestLockedData.Scan0, DestImageData, 0, ByteCount); 

     //Unlock for now 
     Newbmp.UnlockBits(DestLockedData); 

     for (int ArrayIndex = 0; ArrayIndex < ByteCount; ArrayIndex++) 
     { 
      if (WidthCount == Newbmp.Width) 
      { 
       //increment the line and push the index by the stride 
       ArrayIndex = (++CurrentLine) * DestStride; 
       continue; 
      } 

      DestImageData[ArrayIndex] = SrcImageData[ArrayIndex]; 
      WidthCount++; 
     } 

     //Lock the bits again 
     DestLockedData = Newbmp.LockBits(DestRect, ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); 

     //Copy data from byte array to IntPtr 
     Marshal.Copy(DestImageData, 0, DestLockedData.Scan0, ByteCount); 

     //Unlock bits 
     Newbmp.UnlockBits(DestLockedData); 

     // Return the bitmap 
     return Newbmp; 
    } 

나는 데 가장 큰 문제는 SourceLockedData.Stride 및 DestLockedData.Stride 모두 각각의 이미지의 폭보다 작은 것입니다. 어떻게 그렇게 될수 있니? 보폭에 대해 알고있는 모든 것에서 데이터의 한 스캔 라인에서 다음 스캔 라인까지의 비트 수입니다. 이것이 너비보다 작은 것은 어떻게 수학적으로 가능합니까?

LockBits 또는 BitmapData를 잘못 사용하고 있습니까? BitmapData를 신뢰할 수 없습니까? 보폭을 손으로 계산해야합니까?

톰 P.

+2

_bits_ 대신 _bytes_의 수를 '보폭'하지 않습니까? –

답변

0

난 당신이 RLE 비트 맵을 처리하는 경우 보폭은 폭보다 덜 수 있다는 것을 알아 냈다. 내가로드 할 비트 맵은 TIFF이므로 RLE8로 인코딩됩니다.

+0

압축 형식이 있다면 상수 보폭에 전혀 의지 할 수 없습니다. –

+3

1bpp 이미지에 RLE8 압축이 없으며 8bpp 이미지에만 사용됩니다. 보폭은 바이트가 아닌 바이트 단위이며, 1bpp 이미지의 너비보다 작은 이유를 쉽게 설명합니다. –