python - 从 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)
解决方案
这Camera Roll
是一个“已知的 Windows 文件夹”,这意味着某些 API 可以为您检索确切的路径(即使它不是默认路径):
该knownfolderid
文档将为您提供所需文件夹的常量名称(在您的情况下FOLDERID_CameraRoll
)。正如您在链接页面中看到的那样,默认值是%USERPROFILE%\Pictures\Camera Roll
(这是默认值,所以这并不意味着每个人都一样)。
Python 中的问题是您需要使用ctypes
它,这有时会很麻烦(尤其是在您必须处理 GUID 并释放 API 返回的内存的情况下)。
这个要点给出了一个很好的例子,说明如何SHGetKnownFolderPath
使用 ctypes 从 Python 调用。在您的情况下,您只需要类CameraRoll
中的成员,FOLDERID
因此您可以大大简化代码。
旁注:不要轮询进程结束,只需使用wait()
Popen 对象上的函数。
推荐阅读
- python - 如何对列文本的一部分进行排序?
- google-app-engine - 请解释 App Engine Instances 参数
- ios - React Native,将图像存储在用户库中而不压缩
- c# - 将备忘录添加到包库的最简洁方法是什么
- powershell - 如何在 Internet Explorer 上更改选择下拉网页
- android - 删除 imageview 背景颜色
- javascript - 如何获取未在 java 中定义的语言环境 DisplayName
- dart - 如何在 web(工具提示)中创建漂亮的 alertDialog?
- python-3.x - 如何在 PyQt 布局中扩展 matplotlib 图形?
- awk - 将秒转换为毫秒