【问题标题】:How to save a picture from a webcam如何从网络摄像头保存图片
【发布时间】:2013-12-24 19:34:33
【问题描述】:

我正在使用 Aaron Ballman 的 Windows 功能套件从我的网络摄像头捕获视频。它工作正常,但... webcam.startpreview 启动出现的相机图像,webcam.stoppreview 照它说的做并停止视频。

我的问题是,在 stoppreview 之后,我在画布控件中留下了一张静止图像,我需要知道如何将该图像保存到磁盘 - 最好是作为 jpg 文件。

【问题讨论】:

    标签: video webcam realbasic xojo


    【解决方案1】:

    在这种情况下,画布控件实际上并不包含图像;它仅用于指定直接显示在 Canvas 顶部的系统管理窗口的尺寸和父级。

    要获取当前帧,您需要捕获此系统管理窗口的内容。

    例如将此函数添加到 WebCamWFS 模块:

    Function CaptureFrame(SourceCanvas As Canvas) As Picture
      Declare Function GetDC Lib "User32" (HWND As Integer) As Integer
      Declare Function BitBlt Lib "GDI32" (DCdest As Integer, xDest As Integer, yDest As Integer, nWidth As Integer, _
          nHeight As Integer, DCdource As Integer, xSource As Integer, ySource As Integer, rasterOp As Integer) As Boolean
      Declare Function ReleaseDC Lib "User32" (HWND As Integer, DC As Integer) As Integer
    
      Const SRCCOPY = &h00CC0020
      Const CAPTUREBLT = &h40000000
    
      Dim hDC, w, h As Integer
      hDC = GetDC(mWnd)
      w = SourceCanvas.Width
      h = SourceCanvas.Height
      x = SourceCanvas.Left + SourceCanvas.Window.Left
      y = SourceCanvas.Top + SourceCanvas.Window.Top
    
      Dim capture As New Picture(w, h, 24)
      Call BitBlt(Capture.Graphics.Handle(1), 0, 0, w, h, hDC, 0, 0, SRCCOPY Or CAPTUREBLT)
      Call ReleaseDC(mWnd, hDC)
      Return capture
    End Function
    

    使用Canvas控件的DrawInto方法将图片复制到Picture对象,然后将图片保存到文件中:

      Dim mypic As New Picture(TargetCanvas.Width, TargetCanvas.Height, 32)
      TargetCanvas.Drawinto(mypic.Graphics, 0, 0)
      Dim saveto As FolderItem = GetSaveFolderItem("", "mypic.jpg")
      mypic.Save(saveto, Picture.SaveAsJPEG)
    

    【讨论】:

    • 谢谢惊奇,但恐怕它不起作用......我得到的只是一个白色的矩形。我确实将最后一行更改为:- saveto.SaveAsJPEG mypic.
    • 在调用StopPreview之前尝试保存画布。
    • 嗨,很惊讶,是的,我已经尝试过了,并尝试在不同的地方保存到不同的图形对象,例如另一个画布等。绝对是'DrawInto'不起作用,我不知道为什么。我试过改变窗口类型和各种。还有其他想法吗?
    • 您好,再次惊讶,一如既往,非常感谢您在这件事上的帮助。我找到了一些可以转换的 Delphi 代码。它使用类似于 Aarons 代码的 API 调用,我研究了如何使用“WM_CAP_GRAB_FRAME”将图像放在剪贴板上。从那里开始,使用 Realbasic 的剪贴板对象很容易将其保存为图片。我给了你荣誉,因为你应得的——你激励了我!干杯,艾伦...
    • 艾伦,如果你能发布你想出的代码作为答案,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多