2012-12-30 2 views
3

원시 바이트에서 비트 맵 객체를 만들려고합니다. 은이고 샘플 당 8 비트 (픽셀 당 3 바이트)입니다. 이제이 내 받침대는 폭의 3 배가 될 것입니다.원시 바이트에서 비트 맵 객체 만들기

그러나 Bitmap 클래스는 스트라이드 값에 대해 항상 4의 배율을 찾습니다. 이 문제를 해결하는 방법을 알려주십시오. 4의 배수를 주면 이미지가 제대로 나오지 않습니다.

Bitmap im = new Bitmap(MyOBJ.PixelData.Columns, MyOBJ.PixelData.Rows, (MyOBJ.PixelData.Columns*3), 
System.Drawing.Imaging.PixelFormat.Format24bppRgb, Marshal.UnsafeAddrOfPinnedArrayElement(images[imageIndex], 0)); 
+0

적어도 너비가 4의 배수 인 이미지를 사용하여 스트라이드가 중요하지 않도록 테스트 해보십시오. 일단 체크 아웃하면 LockBits를 사용하고 한 번에 한 줄씩 복사하여 비 호환성 문제를 해결해야합니다. –

+1

24 비트 비트 맵의 ​​경우 스트라이드는 명시한대로 4 바이트의 배수 여야합니다. 따라서 24 비트 비트 맵의 ​​보폭은 stride = (((width * 3) + 3)/4) * 4 입니다. 물론 원시 데이터도 마지막에 필요한 모든 패딩으로 포맷해야합니다 각 행의 – Dampsquid

답변

5

필자는 배열의 모든 행을 패딩하여 필요한 형식으로 변환하는 간단한 샘플을 작성했습니다. 2x2 체크 보드 비트 맵을 생성합니다.

byte[] bytes = 
    { 
     255, 255, 255, 
     0, 0, 0, 
     0, 0, 0, 
     255, 255, 255, 
    }; 
var columns = 2; 
var rows = 2; 
var stride = columns*4; 
var newbytes = PadLines(bytes, rows, columns); 
var im = new Bitmap(columns, rows, stride, 
        PixelFormat.Format24bppRgb, 
        Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0)); 

PadLines 방법은 아래에 기술되어있다. 비트 맵이 큰 경우에 대비하여 Buffer.BlockCopy을 사용하여 최적화하려고했습니다.

static byte[] PadLines(byte[] bytes, int rows, int columns) 
{ 
    //The old and new offsets could be passed through parameters, 
    //but I hardcoded them here as a sample. 
    var currentStride = columns*3; 
    var newStride = columns*4; 
    var newBytes = new byte[newStride*rows]; 
    for (var i = 0; i < rows; i++) 
     Buffer.BlockCopy(bytes, currentStride*i, newBytes, newStride * i, currentStride); 
    return newBytes; 
} 
+0

고맙습니다. 매우 완벽하게 작동합니다. – user1935868

+0

@Eve 나는 스트라이드에 관한 문제가 있다고 생각합니다. 나는 당신의 솔루션을 사용했지만 색상이 좋지 않습니다. 내 이미지 8bit, 256bppi. PixelFormat을 'Format8bppIndexed'로 변경했습니다. 그러나 나는 Stride를 관리 할 수 ​​없었다. 너 나 좀 도와 줄 수있어? – goGud