procedure RawImageData420(rY : pointer; //RAW DATA 이미지 획득
rU : pointer;
rV : pointer;
width : integer;
height : integer;
Chnum : byte;
imgMode : byte;
DIBType : integer); cdecl;
var
Stream : TMemoryStream;
block : pbyteArray;
block2 : pByteArray;
size : integer;
tmpBuff1 : pByteArray;
tmpBuff2 : pByteArray;
h : integer;
type
TRGBTripleArray = array[WORD] of TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
var
i,j : INTEGER;
Bitmap: TBitmap;
row : pByteArray;
begin
Fmain.DoubleBuffered := true;
//GetMem(Yuv422data,width*height*2);
Conv_420to422(RawDataY,RawDataU,RawDataV,@Yuv422Data[0],width,height); //
with RawDataInfo do
begin
pRawData := @Yuv422Data[0];
mWidth := Width;
mHeight := Height;
mCamNo := CamNo;
mImgMode := ImgMode;
mDIBType := DIBType;
end;
GetMem(block, 1250000);
GetMem(block2, 1250000);
//720 * 240 모드 이미지일경우 이를 720 * 480 이미지로 변환처리함.
if (RawDataInfo.mWidth >= 640) and (RawDataInfo.mHeight < 480) then
begin
GetMem(tmpBuff1,1250000);
GetMem(tmpBuff2,1250000);
CopyMemory(tmpBuff1,RawDataInfo.pRawdata,RawDataInfo.mWidth *RawDataInfo.mHeight * 2);
for h := 0 to RawDataInfo.mHeight do
begin
CopyMemory(@tmpBuff2[h*2*RawDataInfo.mWidth*2],@tmpBuff1[h*RawDataInfo.mWidth*2],RawDataInfo.mWidth*2);
CopyMemory(@tmpBuff2[(h*2+1)*RawDataInfo.mWidth*2],@tmpBuff1[h*RawDataInfo.mWidth*2],RawDataInfo.mWidth*2);
end;
RawDataInfo.mHeight := RawDataInfo.mHeight * 2;
CopyMemory(block,tmpBuff2,RawDataInfo.mWidth *RawDataInfo.mHeight * 2);
FreeMem(tmpBuff1,1250000);
FreeMem(tmpBuff2,1250000);
end
else
begin
CopyMemory(block, RawDataInfo.pRawdata, RawDataInfo.mWidth *RawDataInfo.mHeight * 2);
end;
Stream := TMemoryStream.Create;
Stream.Position := 0;
try
Stream.Write(block^,1250000);
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromStream(Stream); -->이게 맞는건지..의심이 가네요.
Bitmap.PixelFormat := pf24bit;
Bitmap.Width := RawDataInfo.mWidth;
Bitmap.Height := RawDataInfo.mHeight;
for j := 0 to Bitmap.Height-1 do
begin
//stream.Read(block2[0],1250000);
row := PByteArray(Bitmap.Scanline[j]);
for i := 0 to Bitmap.Width-1 do
begin
row[j*3] := j;
row[j*3+1] := i*j mod 255;
row[j*3+2] := i;
end
end;
Fmain.Image1.Picture.Graphic := Bitmap;
FMain.Image1.Invalidate;
Finally
Bitmap.Free;
end;
Finally
Stream.Free;
FreeMem(block);
FreeMem(block2);
end;
end;
메모리스트림을 이용하여 Raw Data를 카피하는 부분에서 잘못된건지..에러는 나지 않는데 화면상에 이미지가 보이질 않는군요. 메모리 카피가 잘못된건지..
Bitmap 쪽으로 Raw 이미지 데이터를 카피하는것이 잘못된건지..에궁 헷갈리어요.
소스를 보시고 잘못된 점이 있으면 알려주시면 감사하겠습니다.
그럼..조언 부탁드립니다.
F: file of Byte;
StrBuf,i,j: integer;
Stream: array of BYTE;
ImgSRC:PByte;
MVIADecoder:TMVIADecoder;
H: THandle;
size: Longint;
IInfoSize,IImageSize:Dword; //비트맵의 사이즈 얻기
Origin:PByte; //실제 정보을 가지는 포인터
Bi:PBitmapInfo; //비트맵info의 포인터
SS:PBYTE;
Postion:Longint;
count:integer;
begin
image1.Picture.Bitmap.PixelFormat:=pf24bit;
GetDibSizes(Image1.Picture.Bitmap.Handle,IInfoSize,IImageSize);
GetMem(Bi,IInfoSize);
GetMem(Origin,IImageSize);
//Dib의 이미지 정보 얻기
GetDib(Image1.Picture.Bitmap.Handle,Image1.Picture.Bitmap.Palette,Bi^,Origin^);
//사이즈 따라 조정
GetMem(ImgSRC,320*240*3);
//여기서..로우데이터 메모리를 가져오면 되지여
copyMemory(ImgSRC,pointer(stream),sizeof(ImgSRC));
//데이터 연결
SetDIBits(image1.Canvas.Handle,image1.Picture.Bitmap.Handle,
0, bi^.bmiHeader.biHeight,
ImgSRC, bi^, DIB_RGB_COLORS);
image1.Refresh;
application.ProcessMessages;
end;
FreeMem(SS);
FreeMem(ImgSRC);
FreeMem(Bi);
FreeMem(Origin);
end;
이정도 일것 같군여...
조금 고쳐야 할지도 모르겠어여..
제가 쓰던 코드.. 올리는 거라..
참고해서 프로그램 하세여 ^^;;