首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用网络摄像头Windows终端拍摄图片

如何利用网络摄像头Windows终端拍摄图片
EN

Stack Overflow用户
提问于 2022-06-16 04:10:51
回答 1查看 121关注 0票数 2

下面的代码旨在通过windows使用摄像头拍摄一张照片。当我运行代码时,摄像头的引导打开几秒钟(显示它被调用了),然后保存PNG图像,但是它是由back像素(3kb)填充的。我不熟悉windows,所以解决这个问题可能很简单。有人能猜到是怎么回事吗?

代码语言:javascript
复制
package main

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "os/exec"
    "syscall"
    "unsafe"
)

var (
    avicap32                    = syscall.NewLazyDLL("avicap32.dll")
    proccapCreateCaptureWindowA = avicap32.NewProc("capCreateCaptureWindowA")

    user32           = syscall.NewLazyDLL("user32.dll")
    procSendMessageA = user32.NewProc("SendMessageA")
)

func CaptureWebcam() {
    var name = "WebcamCapture"
    handle, _, _ := proccapCreateCaptureWindowA.Call(uintptr(unsafe.Pointer(&name)), 0, 0, 0, 320, 240, 0, 0)
    procSendMessageA.Call(handle, 0x40A, 0, 0)  //WM_CAP_DRIVER_CONNECT
    procSendMessageA.Call(handle, 0x432, 30, 0) //WM_CAP_SET_PREVIEW
    procSendMessageA.Call(handle, 0x43C, 0, 0)  //WM_CAP_GRAB_FRAME
    procSendMessageA.Call(handle, 0x41E, 0, 0)  //WM_CAP_EDIT_COPY
    procSendMessageA.Call(handle, 0x40B, 0, 0)  //WM_CAP_DRIVER_DISCONNECT
    camera, err := os.Create("Image.png")
    if err != nil {
        fmt.Println(err)
        return
    }
    clip, err := readClipboard()
    if err != nil {
        fmt.Println(err)
        return
    }
    _, err = io.Copy(camera, clip)
    if err != nil {
        fmt.Println(err)
        return
    }
    camera.Close()
}

func readClipboard() (io.Reader, error) {
    f, err := ioutil.TempFile("", "")
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    f.Close()
    _, err = exec.Command("PowerShell", "-Command", "Add-Type", "-AssemblyName", fmt.Sprintf("System.Windows.Forms;$clip=[Windows.Forms.Clipboard]::GetImage();if ($clip -ne $null) { $clip.Save('%s') };", f.Name())).CombinedOutput()
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    r := new(bytes.Buffer)
    file, err := os.Open(f.Name())
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    if _, err := io.Copy(r, file); err != nil {
        fmt.Println(err)
        return nil, err
    }
    file.Close()
    os.Remove(f.Name())
    return r, nil
}

func main() {
    CaptureWebcam()
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-16 08:59:49

数据似乎是位图剪贴板格式。您也可以直接使用剪贴板API

来自文件样本的代码片段。

代码语言:javascript
复制
                case CF_BITMAP: 
                    hdcMem = CreateCompatibleDC(hdc); 
                    if (hdcMem != NULL) 
                    { 
                        if (OpenClipboard(hwnd)) 
                        { 
                            hbm = (HBITMAP) 
                                GetClipboardData(uFormat); 
                            SelectObject(hdcMem, hbm); 
                            GetClientRect(hwnd, &rc); 
 
                            BitBlt(hdc, 0, 0, rc.right, rc.bottom, 
                                hdcMem, 0, 0, SRCCOPY); 
                            CloseClipboard(); 
                        } 
                        DeleteDC(hdcMem); 
                    } 
                    break;

附加了另一个代码从易数码相机连接

代码语言:javascript
复制
void CYourProject::OnTimer(UINT nIDEvent) 
{
 if(nIDEvent==1)// First Timer
 {
   capGrabFrame(hWndC); // simple macro that sample a single frame from the 
                        // camera.
   capEditCopy(hWndC);  // simple macro that edit a copy of the frame.
   OpenClipboard();     //like virtual memory.
 
   //m_hBmp is a Handle to Bitmap.
   m_hBmp = (HBITMAP)::GetClipboardData(CF_BITMAP); 
   CloseClipboard();
 
   //...
 }
 CDialog::OnTimer(nIDEvent);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72640357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档