我看到例子都是这样保存一帧图片的,sendmessage(hWndC, WM_CAP_SAVEDIB, 0, longint(pchar('f:\2.bmp')));有没有其他的办法能把一帧图片保存到内存流中或者image1控件中,或者其他变通的办法?

解决方案 »

  1.   

    try this:WM_CAP_PAL_SAVE
    The WM_CAP_PAL_SAVE message saves the current palette to a palette file. Palette files typically use the filename extension .PAL. You can send this message explicitly or by using the capPaletteSave macro.WM_CAP_PAL_SAVE 
    wParam = (WPARAM) 0; 
    lParam = (LPARAM) (LPVOID) (LPSTR) (szName); but WM_CAP_SAVEDIB: it's not defined , can't find it's define...
      

  2.   

    要是我,就找最简单的办法.
    用file实现.
      

  3.   

    beyondtkl您好,我说的WM_CAP_SAVEDIB是指WM_CAP_FILE_SAVEDIB,您说的WM_CAP_PAL_SAVE这个消息好象也是使用文件名的方式吧?和WM_CAP_FILE_SAVEDIB没什么区别吧?
      

  4.   

    vfork你说的用文件实现,就得频繁的写硬盘,对硬盘不好.
      

  5.   

    你创建的VFW的窗体时,,不是有一个参数传入显示在哪个控件中吗,其中的CANVAS就是可以取,并可以保存成图片 
      

  6.   

    ghyghost,我测试了好多次了,好象显示不了啊,能不能示范一下?谢谢
      

  7.   

    回来了,给你源程序吧。呵呵。。procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp: TBitmap;
    begin
      bmp := TBitmap.Create; //假设你需要截取的图象大小为100×100
      bmp.Width := panel1.width;
      bmp.Height := panel1.height;
      BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
        getdc(panel1.handle), 0, 0, SRCCOPY); //截取image1中从x,y开始的100×100的图象
      image1.Picture.Bitmap.Assign(bmp); //保存在bmp中
      image1.Picture.Bitmap.SaveToFile('c:\1.bmp');
      bmp.free;
      bmp:=nil;
    end;上面是将PANEL1中的内容以非sendmessage的形式保存成图片的过程。而下面的就是VFW的初始化,注意capCreateCaptureWindow函数的参数,很重要:
    procedure TForm1.suiButton1Click(Sender: TObject);
    begin
      try
        ghyghost_cap_handle := capCreateCaptureWindow(
          'my video cap',
          WS_CHILD + WS_VISIBLE + WS_EX_CLIENTEDGE + WS_EX_DLGMODALFRAME,
          0,
          0,
          Panel1.Width,
          Panel1.Height,
          Panel1.Handle,//这个参数就是想在哪个控件中进行VFW映射的,这里选择panel1。
          0);
        if (capDriverConnect(ghyghost_cap_handle, 0)) <> 0 then
        begin
          CapPreviewRate(ghyghost_cap_handle, 30);
          CapPreview(ghyghost_cap_handle, 1);
        end;
      except
        showmessage('you video cap bad');
      end;
      SendMessage(ghyghost_cap_handle, WM_CAP_SET_SCALE, WParam(true), 0);
    end;
      

  8.   

    ghyghost,你这程序如果有别的程序覆盖PANEL1就会显示别的程序的图片,就是说这样的话,程序不能被覆盖,这和拷贝屏幕差不多啊,有什么办法在被覆盖的时候仍然正常吗?谢谢
      

  9.   

    VFW没用过哦,不懂http://lysoft.7u7.net
      

  10.   

    你说的就是抓图对吗?
    我这里有:
    这是一个过程,功能是把图片保存到path路径下,如果你要保存到image中,你就从这个临时路径中load就OK了,不知道这样你满意吗?
    ================
    procedure SaveCapImage(path:string);export;
    begin
      if ghCapWnd<>0 then
      begin
        SaveDialog.DefaultExt:='bmp';
        Savedialog.Filter:='Bitmap Files (*.Bmp)|*.bmp';
        if SaveDialog.Execute   then
           Sendmessage(ghCapWnd,WM_CAP_FILE_SAVEDIB,0,Longint(Pchar(path)));    
      end;
    end;
      

  11.   

    对不起,上面忘记去掉多余的代码了
    应该是下面的
    ==================================
    你说的就是抓图对吗?
    我这里有:
    这是一个过程,功能是把图片保存到path路径下,如果你要保存到image中,你就从这个临时路径中load就OK了,不知道这样你满意吗?
    ================
    procedure SaveCapImage(path:string);export;
    begin
      if ghCapWnd<>0 then//补充:这个句柄是你开始创建的哦,创建过程见下一段代码
         Sendmessage(ghCapWnd,WM_CAP_FILE_SAVEDIB,0,Longint(Pchar(path)));    
    end;//////
    ghCapWnd:=CapCreateCaptureWindowA(Pchar('QingHuntSoft'),
                                        WS_CHILD or WS_VISIBLE,
                                        0,
                                        0,
                                        VideoWind.Width,
                                        VideoWind.Height,
                                        VideoWind.Handle,
                                        10);