首页 > 解决方案 > 使用 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)

标签: pythonimagepyqtqgis

解决方案


推荐阅读