2017-05-23 18 views
0

나는 비디오 플레이어를 만들기 위해 고심하고 있습니다. 나는 cpu isue 때문에 sharpdx sdk로 이미지를 그려야한다. 하지만 나는 돈이있다. 프레임을 바이트 배열로 가져옵니다. 이미지의 픽셀 형식은 BGRA32입니다. 나는 그것을 변환하기 위해 다음 코드를 썼다. 그러나 그것은 나에게 "값이 예상 범위 내에 들지 않는다"라는 오류를줍니다.어떻게하면 바이트 배열에서 Managed.Graphics.Direct2D.Bitmap 객체를 만들 수 있습니까? #

내 코드 :

private Bitmap getBitmap(byte[] frame) { 
    return RenderTarget.CreateBitmap(new SizeU((uint)img_w, (uint)img_h), frame, 0, new BitmapProperties(new PixelFormat(DxgiFormat.B8G8R8A8_UNORM, AlphaMode.Ignore), 100, 100)); 
} 

참고 img_w = ​​720 img_h = 576, I는 우선 복사 데이터보다 이미지를 만드는 것이 시도 프레임 어레이의 길이 = 720 * 576 * 4

이미지. 그러나 그것은 또한 작동하지 않습니다. 첫 번째 행을 모든 행에 복사합니다. enter image description here

왼쪽 이미지는 원본 이미지이며, 오른쪽은 바이트 배열에서 복사하여 만듭니다. 이 이미지를 만들기 위해 다음 코드를 사용했습니다.

private Bitmap getBitmap(byte[] frame) { 
     var bmp = RenderTarget.CreateBitmap(new SizeU((uint)img_w, (uint)img_h), IntPtr.Zero, 0, new BitmapProperties(new PixelFormat(DxgiFormat.B8G8R8A8_UNORM, AlphaMode.Ignore), 100, 100)); 
     bmp.CopyFromMemory(new RectU(0, 0, (uint)img_w, (uint)img_h), frame, 0); 

     return bmp; 
    } 
+0

1) '프레임'에 예상 한 내용이 포함되어 있는지 확인 했습니까? 즉,보고있는 내용이 포함되지 않았는지 확인하십시오 (첫 번째 행이 반복됨). (두 번째 행이 첫 번째 행과 다르다는 것을 증명하기에 충분한 바이트 값을 출력하십시오.) 2) 임의의 바이트로 채우고 다시 한 행만 반복되는지보십시오. 3) 또한 새로운 비트 맵을 표시하는 코드 줄을 표시하십시오. 거기에 뭔가 잘못 될 수 있습니까? – ToolmakerSteve

답변

0

"0"이있는 마지막 매개 변수는 원본 비트 맵의 ​​"피치"여야합니다.

ID2D1Bitmap::CopyFromMemory method 가입일

:

srcData에 저장된 원본 비트 맵의 ​​보폭이나 피치. 보폭은 스캔 라인의 바이트 수입니다 (메모리의 한 행 픽셀). 보폭은 다음 수식에서 계산할 수 있습니다. 픽셀 너비 * 픽셀 당 바이트 수 + 메모리 패딩.

4 * img_w 당신은 픽셀 당 4 바이트를 사용하고, 소스 행은 아마도 패딩이 없다, 그래서 시도 :

bmp.CopyFromMemory(new RectU(0, 0, (uint)img_w, (uint)img_h), frame, 4 * img_w); 

"0"퍼팅 여기에 의미 "각 행에서 시작에 0을 추가 이전 행의 주소를 사용하여 다음 행의 시작을 찾습니다. " 즉, 동일한 메모리 주소에서 행을 계속 가져 와서 "첫 행이 반복되는"이유를 설명합니다.