python - 使用 PyQt 从 QGIS 插件中拍照
问题描述
我在插件中有一个按钮来拍照并将其与 QGIS 中的图层功能相关联。
我的目标是选择一个特征,打开一个相机视图(取景器),拍照并将其保存为特征 ID 和日期时间作为文件名(例如20210412-112351_223.jpg)。
为此,我根据这篇文章使用下面的代码。
问题是当我在我的笔记本电脑中使用这个插件时,拍摄的图片是 1280x720,但使用 Surface Book 3 时,结果图片是 640x320。
是否可以在代码中设置图片的大小?
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from qgis.core import (QgsProject,
Qgis,
QgsExpressionContextUtils)
from qgis.utils import iface
import os
import time
class creaventana(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 1280, 720)
self.setStyleSheet("background : lightgrey;")
self.available_cameras = QCameraInfo.availableCameras()
if not self.available_cameras:
iface.messageBar().pushMessage('No hay cámaras', 'El dispositivo no tiene ninguna cámara',
level=Qgis.Warning,
duration=5)
self.status = QStatusBar()
self.status.setStyleSheet("background : white;")
self.setStatusBar(self.status)
self.viewfinder = QCameraViewfinder()
self.viewfinder.show()
self.setCentralWidget(self.viewfinder)
self.select_camera(0)
toolbar = QToolBar("Cámara")
self.addToolBar(toolbar)
click_action = QAction("Hacer foto", self)
click_action.setStatusTip("Esto hace la foto")
click_action.setToolTip("Hacer foto")
click_action.triggered.connect(self.click_photo)
toolbar.addAction(click_action)
camera_selector = QComboBox()
camera_selector.setStatusTip("Cámara frontal / trasera")
camera_selector.setToolTip("Elegir cámara")
camera_selector.setToolTipDuration(2500)
camera_selector.addItems([camera.description()
for camera in self.available_cameras])
camera_selector.currentIndexChanged.connect(self.select_camera)
toolbar.addWidget(camera_selector)
toolbar.setStyleSheet("background : white;")
self.setWindowTitle("PyQt5 Cam")
def select_camera(self, i):
self.camera = QCamera(self.available_cameras[i])
self.camera.setViewfinder(self.viewfinder)
self.camera.setCaptureMode(QCamera.CaptureStillImage)
self.camera.error.connect(lambda: self.alert(self.camera.errorString()))
self.camera.start()
self.capture = QCameraImageCapture(self.camera)
self.capture.error.connect(lambda error_msg, error,
msg: self.alert(msg))
self.capture.imageCaptured.connect(lambda d, i: self.status.showMessage("Imagen tomada: " + str(self.save_seq)))
self.current_camera_name = self.available_cameras[i].description()
self.save_seq = 0
def click_photo(self):
individuos = QgsProject.instance().mapLayersByName('Individuos')[0]
individuoSeleccionado = individuos.selectedFeatures()
for individuo in individuoSeleccionado:
idind = individuo['id_ind']
timestamp = time.strftime('%Y%m%d-%H%M%S')
ruta = 'D:/fotos/'
self.capture.capture(os.path.join(ruta, "%s_%s.jpg" % (idind, timestamp)))
self.save_seq += 1
def alert(self, msg):
error = QErrorMessage(self)
error.showMessage(msg)
def abrecamara(self):
individuos = QgsProject.instance().mapLayersByName('Individuos')[0]
individuoSeleccionado = individuos.selectedFeatures()
cuentaIndividuoSeleccionado = len(list(individuoSeleccionado))
if cuentaIndividuoSeleccionado == 1:
ventana = creaventana()
ventana.show()
elif cuentaIndividuoSeleccionado > 1:
iface.messageBar().pushMessage('Selección', 'Solo puede haber un individuo seleccionado',
level=Qgis.Warning,
duration=5)
elif cuentaIndividuoSeleccionado == 0:
iface.messageBar().pushMessage('Selección', 'Tiene que haber al menos un individuo seleccionado',
level=Qgis.Warning,
duration=5)
解决方案
推荐阅读
- python - 如果单击 QTableView 内的空白区域,如何防止弹出上下文菜单?
- java - 注入由枚举值键入的接口实现映射
- python - 如何根据熊猫的每日数据记录获取相应年份的列值和周数的每周平均值
- javascript - 动态生成的元素不触发事件监听器
- ios - 在等待属性初始化的 init 中调用函数
- database - hybris - 一对多和多对多关系
- python-3.x - 在 Python 中用可变长度的字符串和数字很好地列打印一个列表
- javascript - React Native Android:在一行中包含文本到父视图内部
- android - 在本地网络上加载 PWA 作为 Android 上的主屏幕应用程序
- javascript - JS 或 PHP 密码保护 Figma 或通用原型链接的方式?