CANON数码相机SDK回调函数,此处也可以通过参数将流格式化成jpg格式:
function ViewFinder_CallbackFunction(pBuf:pointer;Size:cdUInt32;Format:cdUInt32;Context : cdContext) : cdUInt32 stdcall;
begin
    BmpStream.Clear;
    BmpStream.WriteBuffer(pBuf^,Size);
    BmpStream.Position :=0;
    //BmpStream.SaveToFile('c:\a.Bmp');
    Result :=cdOK;
end;
通过定时器绘制图像,定时器的Interval设置成多少都闪动的厉害:
procedure TfrmMain.ViewFinderTimerTimer(Sender: TObject);
begin
    Image1.Picture.BitMap.LoadFromStream(BmpStream);
end;

解决方案 »

  1.   

    我用VB写的同样代码,只是没有通过流操作,直接读取Buffer,然后通过定时器绘制图形,就基本没有闪动。
      

  2.   

    VC写的同样代码,只是没有通过流操作,直接读取Buffer,然后通过定时器绘制图形,就基本没有闪动。
      

  3.   

    记得有人重写了TIMAGE单元解决这个问题,原理就是开启双缓冲
    另外的办法用的是TPaintBox
    代码
    var
    B:TBitmap;
    begin
    B:=TBitmap.Create;
    B.LoadFromStream(BmpStream);
    PaintBox1.Canvas.CopyRect(PaintBox1.Canvas.ClipRect,B.Canvas,B.Canvas.ClipRect);
    B.Free;
    end;
      

  4.   

    原理就是 双缓冲
    先写到一个图上,然后再赋给要显示的图;procedure TfrmMain.ViewFinderTimerTimer(Sender: TObject);
    var
      Bitmap: TBitMap;
    begin
        Bitmap := TBitMap.Create;
        Bitmap.LoadFromStream(BmpStream);
      //  Image1.Picture.BitMap.LoadFromStream(BmpStream);
        Image1.Picture.BitMap.Canvas.Draw(0, 0, Bitmap);
        Bitmap.Free;
    end;
      

  5.   

    foxyy8888 (古来圣贤皆寂寞,惟有饮者留其名!) 抽空喝上两杯!
      

  6.   

    MASM写的同样代码,只是没有通过流操作,直接读取Buffer,然后通过定时器绘制图形,就基本没有闪动。
      

  7.   

    开个玩笑,delphi不比vb慢的
    可能你调用的问题
      

  8.   

    谢谢SonicX(SonicX)和ffwin() 
    每个人100分吧。
      

  9.   

    TImage有个IncrementalDisplay属性,试一下嘛
      

  10.   

    請問楼主:err = CDStartViewfinder(m_hSource,FILEFORMAT_BMP,ViewFinderCallBackFun,(cdContext)this );
    这是VC++的示例程序原码,为什么ViewFinderCallBackFun回调函数不能被调用?ViewFinderCallBackFun就是不启动.