2010-07-28 7 views
2

128 x 128 배열의 복식으로 시작하여 각 double에 대한 비례 값을 갖는 1D 바이트 배열로 변환합니다.그레이 스케일에 대한 바이트 [] BitmapImage

나는 그 바이트의 배열을 가지고 메모리 스트림 (아래 dataStream)에 전원을 켜고 시도하고 BitmapImage과 같이에 그것을 넣어하십시오 System.Windows.Controls.Image

이입니다 여기에 imgScan

imgScan.Width = 128; 
imgScan.Height = 128; 
BitmapImage bi = new BitmapImage(); 
bi.SourceRect = new Int32Rect(0, 0, width, height); 
bi.StreamSource = dataStream; 
imgScan.Source = bi; 

예상 된 이미지를 생성하지 않습니다 (단지 흰색 사각형을 얻습니다).

어떻게해야합니까?

답변

1

코드에서 스트림에 원시 이미지 블록이 아닌 완전한 이미지 파일이 있어야합니다.

const int bytesPerPixel = 4; 
int stride = bytesPerPixel * pixelsPerLine; 
UInt32[] pixelBytes = new uint[lineCount * pixelsPerLine]; 

for (int y = 0; y < lineCount; y++) 
{ 
    int destinationLineStart = y * pixelsPerLine; 
    int sourceLineStart = y * pixelsPerLine; 
    for (int x = 0; x < pixelsPerLine; x++) 
    { 
     pixelBytes[x] = _rgbPixels[x].Pbgr32; 
    } 
} 
var bmp = BitmapSource.Create(pixelsPerLine, lineCount, 96, 96, PixelFormats.Pbgra32, null, pixelBytes, stride); 
bmp.Freeze(); 
return bmp; 

당신은 이미 (바이트 배열을) 중첩 루프에서 비트를 해봤지만 왼쪽 : 여기에 (이 그레이 스케일 아니에요,하지만 당신은 아이디어를 얻을 수있는) 데이터 블록에서 비트 맵을 만들고있다 그것에서 당신은 창조하기 전에 오는 것을 볼 수 있습니다.

+0

감사합니다. 한가지 더 질문 : 스트레스는 무엇을 의미합니까? 당신이'bytesPerPixel * pixelsPerLine'으로 설정 한 것을 볼 수 있습니다, 그러나 나는 그 용어에 익숙하지 않습니다. –

+0

보폭은 데이터 블록에서 한 행의 시작에서 다음 행의 시작까지 걸리는 바이트 수입니다. 귀하의 경우에는 바이트 블록의 너비가되지만, 예를 들어 3 바이트 픽셀 (RGB888)이있는 경우 스트라이드는 종종 4 바이트의 배수가됩니다 (3xnumber 픽셀 수)는 4 자체의 배수가 아닙니다. 라인이 항상 멋지게 정렬 된 메모리 주소에서 시작하도록하고, 사람들이 이와 같은 perf 세부 사항에 대해 많이 신경 쓴 시절의 숙취입니다. –

+0

Brilliant. 고마워, 윌. –