Q&A

  • Raw 이미지 데이터를 메모리카피하여 화면상에 디스플레이하고자하는데.. 잘 안되네요.
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 이미지 데이터를 카피하는것이 잘못된건지..에궁 헷갈리어요.
소스를 보시고 잘못된 점이 있으면 알려주시면 감사하겠습니다.
그럼..조언 부탁드립니다.
1  COMMENTS
  • Profile
    박상윤 2004.12.04 20:17
    var
        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;


    이정도 일것 같군여...
    조금 고쳐야 할지도 모르겠어여..
    제가 쓰던 코드.. 올리는 거라..
    참고해서 프로그램 하세여 ^^;;