105 lines
4.1 KiB
Python
105 lines
4.1 KiB
Python
# ========================================
|
||
# =============== 截图控制 ===============
|
||
# ========================================
|
||
|
||
from ..image_controller.image_provider import PixmapProvider # 图片提供器
|
||
from ..utils.file_finder import findFiles
|
||
|
||
import time
|
||
from PySide2.QtGui import QGuiApplication, QClipboard, QImage, QPixmap # 截图 剪贴板
|
||
|
||
Clipboard = QClipboard() # 剪贴板
|
||
|
||
|
||
class _ScreenshotControllerClass:
|
||
|
||
def getScreenshot(self, wait=0):
|
||
"""
|
||
延时wait秒后,获取所有屏幕的截图。返回列表(不为空),每项为:\n
|
||
{
|
||
"imgID": 图片ID 或 报错信息 "[Error]开头" ,
|
||
"screenName": 显示器名称 ,
|
||
"width": 截图宽度 ,
|
||
"height": 截图高度 ,
|
||
}
|
||
"""
|
||
if wait > 0:
|
||
time.sleep(wait)
|
||
try:
|
||
grabList = []
|
||
screensList = QGuiApplication.screens()
|
||
for screen in screensList:
|
||
name = screen.name()
|
||
# 获取截图
|
||
pixmap = screen.grabWindow(0)
|
||
width = pixmap.width()
|
||
height = pixmap.height()
|
||
# 检查截图失败
|
||
if width <= 0 or height <= 0:
|
||
imgID = f"[Error] width={width}, height={height}"
|
||
# 检查有效,存入提供器,获取imgID
|
||
else:
|
||
imgID = PixmapProvider.addPixmap(pixmap)
|
||
grabList.append(
|
||
{
|
||
"imgID": imgID,
|
||
"screenName": name,
|
||
"width": width,
|
||
"height": height,
|
||
}
|
||
)
|
||
if not grabList: # 获取到的截图列表为空
|
||
return [{"imgID": f"[Error] grabList is empty."}]
|
||
return grabList
|
||
except Exception as e:
|
||
return [{"imgID": f"[Error] Screenshot: {e}"}]
|
||
|
||
# 对一张图片做裁切。传入原图imgID和裁切参数,返回裁切后的imgID或[Error]
|
||
def getClipImgID(self, imgID, x, y, w, h):
|
||
try:
|
||
pixmap = PixmapProvider.getPixmap(imgID)
|
||
if not pixmap:
|
||
return f'[Error] Screenshot: Key "{imgID}" does not exist in the PixmapProvider dict.'
|
||
if x < 0 or y < 0 or w <= 0 or h <= 0:
|
||
return f"[Error] Screenshot: x/y/w/h value error. {x}/{y}/{w}/{h}"
|
||
pixmap = pixmap.copy(x, y, w, h) # 进行裁切
|
||
clipID = PixmapProvider.addPixmap(pixmap) # 存入提供器,获取imgID
|
||
return clipID
|
||
except Exception as e:
|
||
return f"[Error] Screenshot: {e}"
|
||
|
||
# 获取当前剪贴板的内容
|
||
# type: imgID paths text
|
||
def getPaste(self):
|
||
# 获取剪贴板数据
|
||
mimeData = Clipboard.mimeData()
|
||
res = {"type": ""} # 结果字典
|
||
# 检查剪贴板的内容,若是图片,则提取它并扔给OCR
|
||
if mimeData.hasImage():
|
||
image = Clipboard.image()
|
||
pixmap = QPixmap.fromImage(image)
|
||
pasteID = PixmapProvider.addPixmap(pixmap) # 存入提供器
|
||
res = {"type": "imgID", "imgID": pasteID}
|
||
# 若为URL
|
||
elif mimeData.hasUrls():
|
||
urlList = mimeData.urls()
|
||
paths = []
|
||
for url in urlList: # 遍历URL列表,提取其中的文件
|
||
if url.isLocalFile():
|
||
p = url.toLocalFile()
|
||
paths.append(p)
|
||
paths = findFiles(paths, "image", False) # 过滤,保留图片的路径
|
||
if len(paths) == 0: # 没有有效图片
|
||
res = {"type": "error", "error": "[Warning] No image in clipboard."}
|
||
else: # 将有效图片地址传入OCR,返回地址列表
|
||
res = {"type": "paths", "paths": paths}
|
||
elif mimeData.hasText():
|
||
text = mimeData.text()
|
||
res = {"type": "text", "text": text}
|
||
else:
|
||
res = {"type": "error", "error": "[Warning] Unknow mimeData in clipboard."}
|
||
return res # 返回结果字典
|
||
|
||
|
||
ScreenshotController = _ScreenshotControllerClass()
|