2011-02-11 4 views
1

8 비트 회색조 이미지의 데이터를 어떻게 바이트 배열에 넣을 수 있습니까? 나는 다음과 같은 코드를 시도 :8 비트 그레이 스케일 이미지를 C#의 바이트 [] 배열로 변환하려면 어떻게해야합니까?

private byte[] loadBitmap(string filename, int width, int height) 
{ 
    byte[] data = new byte[width * height]; 
    BitmapData bmpData = null; 
    Bitmap slice = new Bitmap(filename); 
    Rectangle rect = new Rectangle(0, 0, slice.Width, slice.Height); 
    bmpData = slice.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 
    int size = bmpData.Height * bmpData.Stride; 
    System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, data, 0, size); 
    slice.UnlockBits(bmpData); 
    return data; 
} 

을하지만 데이터 배열의 결과 때문에 Format8bppIndexed의 약간의 오차가 있습니다. 어떤 아이디어?

+0

코드 샘플이 "내 컴퓨터에서 작동합니다". Format8bppIndexed는 8 비트 회색조의 경우에는 문제가 없습니다. 테스트 이미지의 너비는 얼마입니까? 소스 크기는'height * stride'이지만 목적지 크기는'width * height'뿐입니다. 따라서 DWORD 정렬로 인해 비트 맵에 패딩이 포함되어 있으면이 패딩이 복사되어 버퍼 오버런을 일으키는 것처럼 보입니다. –

답변

0

이것이 도움이 될지 모르겠지만 시도하겠습니다.

byte[] buffer = null; 
System.Drawing.Image newImg = img.GetThumbnailImage(width, height, null, new System.IntPtr()); 
using (MemoryStream ms = new MemoryStream()) { 
    newImg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 
buffer = ms.ToArray(); 

이것은 이미 수행 한 방식입니다.

희망 하시겠습니까?

+0

작동하지 않습니다. –

관련 문제