2012-04-30 4 views
0

저는 AForge.NET 프레임 워크를 사용하여 프로젝트를 개발했습니다. 내 프로젝트에서 나는 그레이 스케일 비트 맵에서 2D 바이트 배열을 얻으려고 노력해왔다. 이 사이트 및 다른 포럼에는이 주제에 관한 몇 가지 솔루션이 게시되어 있습니다. 그러나 나는 진정한 결과를 얻지 못했습니다. 예를 들어, 그 코드를 사용 :비트 맵을 C#의 2D 바이트 배열로 변환 하시겠습니까?

public static byte[] ImageToByte2(Image img) 
{ 
    byte[] byteArray = new byte[0]; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     img.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
     stream.Close(); 

     byteArray = stream.ToArray(); 
    } 
    return byteArray; 
} 

이 "MemoryStream"메서드 후,이 바이트 배열을 2D로 변환하려고 생각했습니다. 그러나이 코드 샘플을 4 * 8 비트 맵으로 테스트했을 때 1100 값을 byteArray에 반환합니다. 그게 정상인가요? 나는 어디에서 실종 되었습니까?

답변

1

.NET Image 클래스는 Bitmap 이미지와 Metafile 이미지의 두 가지 유형의 이미지에 대한 인터페이스로 사용됩니다. 후자는 비트 맵과 같은 픽셀 배열이 아닌 무언가를 그리는 일련의 명령어로 구성됩니다. Bitmap class itself을 살펴보면 이미지 용 픽셀 데이터를 추출 할 수있는 한 쌍의 LockBits 메소드가 있습니다. Bitmap 클래스에 대한 연결된 참조의 하단에는 이렇게하는 방법에 대한 예도 있습니다.

0

다음 방법을 사용하십시오

public static byte[,] ImageTo2DByteArray(Bitmap bmp) 
    { 
     int width = bmp.Width; 
     int height = bmp.Height; 
     BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 

     byte[] bytes = new byte[height * data.Stride]; 
     try 
     { 
      Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); 
     } 
     finally 
     { 
      bmp.UnlockBits(data); 
     } 

     byte[,] result = new byte[height, width]; 
     for (int y = 0; y < height; ++y) 
      for (int x = 0; x < width; ++x) 
      { 
       int offset = y * data.Stride + x * 3; 
       result[y, x] = (byte)((bytes[offset + 0] + bytes[offset + 1] + bytes[offset + 2])/3); 
      } 
     return result; 
    } 
관련 문제