首页 > 解决方案 > 从 Windows 相机获取文件位置和名称

问题描述

我在使用QCamera对焦和其他东西时遇到了麻烦,所以我想我可以使用附带Windows 10. 基于打开 Windows 相机的线程,我做了一些试验来获取拍摄的图像并将它们用于我的程序。在文档及其 API 中,我没有找到可用的片段(对我来说),所以我创建了下面提到的 hack。它假定图像位于注册表中提到的目标文件夹 'C:\\Users\\*username*\\Pictures\\Camera Roll'中(见下文),但我不知道这是否可靠或如何获得正确的键名。我不认为这是唯一和最干净的解决方案。所以,我的问题是如何获取拍摄的图像并正确打开/关闭相机?实际上,该功能一直等到'WindowsCamera.exe'已离开进程列表并返回目标文件夹中新添加的图像/视频

在注册表中我发现:

条目:带有目标文件夹Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders键名。我不认为这把钥匙是可用的。{3B193882-D3AD-4eab-965A-69829D1FB59F}

我的 hack 的工作示例:

import subprocess
import pathlib
import psutil

def check_for_files(path, pattern):
    print(" check_for_files:", (path, pattern))
    files = []
    for filename in pathlib.Path(path).rglob(pattern):
        files.append (filename)
    return files

def get_Windows_Picture(picpath):
    prefiles = check_for_files(picpath, '*.jpg')
    x = subprocess.call('start microsoft.windows.camera:',  shell=True)
    processlist = [proc.info['name'] for proc in psutil.process_iter (['name'])]
    while 'WindowsCamera.exe' in processlist:
        processlist = [proc.info['name'] for proc in psutil.process_iter (['name'])]
    postfiles = check_for_files(picpath, '*.jpg')
    newfiles = []
    for file in postfiles:
        if file not in prefiles:
            newfiles.append(str(file))
    return newfiles
if __name__ == "__main__":
    picpath = str (pathlib.Path ("C:/Users/*user*/Pictures/Camera Roll"))
    images = get_Windows_Picture(picpath)
    print("Images:", images)

标签: pythonwindowswinapicamera

解决方案


Camera Roll是一个“已知的 Windows 文件夹”,这意味着某些 API 可以为您检索确切的路径(即使它不是默认路径):

knownfolderid文档将为您提供所需文件夹的常量名称(在您的情况下FOLDERID_CameraRoll)。正如您在链接页面中看到的那样,默认值%USERPROFILE%\Pictures\Camera Roll(这是默认值,所以这并不意味着每个人都一样)。

Python 中的问题是您需要使用ctypes它,这有时会很麻烦(尤其是在您必须处理 GUID 并释放 API 返回的内存的情况下)。

这个要点给出了一个很好的例子,说明如何SHGetKnownFolderPath使用 ctypes 从 Python 调用。在您的情况下,您只需要类CameraRoll中的成员,FOLDERID因此您可以大大简化代码。

旁注:不要轮询进程结束,只需使用wait()Popen 对象上的函数。


推荐阅读