Browse Source

所有图片加载操作改用新版文件扫描模块

pull/756/head
hiroi-sora 7 months ago
parent
commit
db3253b329
  1. 4
      UmiOCR-data/py_src/image_controller/screenshot_controller.py
  2. 6
      UmiOCR-data/py_src/server/cmd_server.py
  3. 57
      UmiOCR-data/py_src/utils/file_finder.py
  4. 13
      UmiOCR-data/py_src/utils/utils_connector.py
  5. 2
      UmiOCR-data/qt_res/qml/Main.qml
  6. 17
      UmiOCR-data/qt_res/qml/TabPages/BatchOCR/BatchOCR.qml
  7. 7
      UmiOCR-data/qt_res/qml/TabPages/QRCode/QRCode.qml
  8. 7
      UmiOCR-data/qt_res/qml/TabPages/ScreenshotOCR/ScreenshotOCR.qml

4
UmiOCR-data/py_src/image_controller/screenshot_controller.py

@ -3,7 +3,7 @@
# ========================================
from ..image_controller.image_provider import PixmapProvider # 图片提供器
from ..utils.utils import findImages
from ..utils.file_finder import findFiles
import time
from PySide2.QtGui import QGuiApplication, QClipboard, QImage, QPixmap # 截图 剪贴板
@ -88,7 +88,7 @@ class _ScreenshotControllerClass:
if url.isLocalFile():
p = url.toLocalFile()
paths.append(p)
paths = findImages(paths, False) # 过滤,保留图片的路径
paths = findFiles(paths, "image", False) # 过滤,保留图片的路径
if len(paths) == 0: # 没有有效图片
res = {"type": "error", "error": "[Warning] No image in clipboard."}
else: # 将有效图片地址传入OCR,返回地址列表

6
UmiOCR-data/py_src/server/cmd_server.py

@ -7,7 +7,7 @@ import json
import argparse
from threading import Condition
from ..utils.call_func import CallFunc
from ..utils.utils import findImages
from ..utils.file_finder import findFiles
from ..event_bus.pubsub_service import PubSubService # 发布/订阅管理器
@ -244,7 +244,7 @@ class _Actuator:
else: # 路径
if not paras:
return "[Error] Paths is empty."
paths = findImages(paras, True) # 递归搜索
paths = findFiles(paras, "image", True) # 递归搜索
if not paths:
return "[Error] No valid path."
self.call("ScreenshotOCR", "qml", "ocrPaths", False, paths)
@ -310,7 +310,7 @@ class _Actuator:
except Exception as e:
return f"[Error] {str(e)}"
resText = ""
paths = findImages(paras, True) # 递归搜索图片
paths = findFiles(paras, "image", True) # 递归搜索图片
for index, path in enumerate(paths):
if index != 0:
resText += "\n"

57
UmiOCR-data/py_src/utils/file_finder.py

@ -36,6 +36,46 @@ FileSuf = { # 合法文件后缀
}
# 同步从路径中搜索后缀符合要求的文件,返回路径列表。
def findFiles(
paths: List, # 初始路径列表
sufType: str, # 后缀类型,FileSuf的key
isRecurrence: bool, # 若为True,则递归搜索
):
if isinstance(paths, QJSValue):
paths = paths.toVariant()
if not isinstance(paths, list):
logger.error(f"不合法的路径列表:{paths}, {type(paths)}")
return []
sufs = FileSuf.get(sufType, "")
if not sufs:
logger.error(f"不合法的后缀类型:{sufs}")
return []
def _sufMatching(path):
return os.path.splitext(path)[-1].lower() in sufs
filePaths = []
for p in paths:
if os.path.isfile(p) and _sufMatching(p): # 是文件,直接判断
filePaths.append(os.path.abspath(p))
elif os.path.isdir(p): # 是目录
if isRecurrence: # 需要递归
for root, dirs, files in os.walk(p):
for file in files:
if _sufMatching(file): # 收集子文件
filePaths.append(
os.path.abspath(os.path.join(root, file))
) # 将路径转换为绝对路径
else: # 不递归读取子文件夹
for file in os.listdir(p):
if os.path.isfile(os.path.join(p, file)) and _sufMatching(file):
filePaths.append(os.path.abspath(os.path.join(p, file)))
for i, p in enumerate(filePaths): # 规范化正斜杠
filePaths[i] = p.replace("\\", "/")
return filePaths
# 异步从路径中搜索后缀符合要求的文件
def asynFindFiles(
paths: List, # 初始路径列表
@ -45,19 +85,21 @@ def asynFindFiles(
updateKey: str = "", # 加载中刷新进度的key,不填则无。向事件传入 (已完成的路径数量, 最近一条路径)
updateTime: float = 1.0, # 刷新进度的间距
):
print("开始!!!")
if isinstance(paths, QJSValue):
paths = paths.toVariant()
if not isinstance(paths, list):
logger.error(f"不合法的路径列表:{paths}, {type(paths)}")
PubSubService.publish(completeKey, [])
return
sufs = FileSuf.get(sufType, "")
if not sufs:
print("不合法的后缀!!")
logger.error(f"不合法的后缀类型:{sufs}")
PubSubService.publish(completeKey, [])
return
def _sufMatching(path):
return os.path.splitext(path)[-1].lower() in sufs
if isinstance(paths, QJSValue):
paths = paths.toVariant()
if not isinstance(paths, list):
logger.error(f"_findFiles 传入:{paths}, {type(paths)}")
return []
if not updateKey: # 如果没有刷新事件,则刷新间隔为无穷大
updateTime = float("inf")
updateTime
@ -89,6 +131,5 @@ def asynFindFiles(
fp = fp.replace("\\", "/") # 规范化正斜杠
filePaths.append(fp)
updateEvent(fp)
time.sleep(0.1)
PubSubService.publish(completeKey, filePaths)

13
UmiOCR-data/py_src/utils/utils_connector.py

@ -31,15 +31,10 @@ class UtilsConnector(QObject):
elif key == "hibernate": # 休眠
Platform.HardwareCtrl.hibernate()
# 传入paths和是否递归,返回合法的图片路径
@Slot("QVariant", bool, result="QVariant")
def findImages(self, paths, isRecurrence):
return utils.findImages(paths, isRecurrence)
# 传入paths和是否递归,返回合法的文档路径
@Slot("QVariant", bool, result="QVariant")
def findDocs(self, paths, isRecurrence):
return utils.findDocs(paths, isRecurrence)
# 同步搜索文件,返回合法的文件路径列表
@Slot("QVariant", bool, str, result="QVariant")
def findFiles(self, paths, sufType, isRecurrence):
return file_finder.findFiles(paths, sufType, isRecurrence)
# 异步搜索文件
@Slot("QVariant", str, bool, str, str, float)

2
UmiOCR-data/qt_res/qml/Main.qml

@ -52,6 +52,7 @@ Window {
PubSub { id: pubSub } // /
KeyMouseConnector { id:keyMouse } // /
UtilsConnector { id:utilsConnector } //
AsynFilesLoader { id:asynFilesLoader } //
// onCompleted
MainWindowManager { id:mainWin; mainWin:mainWindowRoot } //
@ -59,6 +60,7 @@ Window {
PopupManager { id: popup } //
GlobalConfigs { id: globalConfigs } //
property alias asynFilesLoader: asynFilesLoader
property alias imageManager: imageManager
property alias globalConfigs: globalConfigs
property alias tab: tab

17
UmiOCR-data/qt_res/qml/TabPages/BatchOCR/BatchOCR.qml

@ -35,18 +35,17 @@ TabPage {
// }
// }
// pathspython file:///
//
function addImages(paths) {
if(ctrlPanel.state_ !== "stop") return
// Python
if(paths.length <= 0) return
const isRecurrence = configsComp.getValue("mission.recurrence")
const res = qmlapp.utilsConnector.findImages(paths, isRecurrence)
if(res.length <= 0){
return
}
//
for(let i in res) {
filesTableView.add({ path: res[i], time: "", state: "" })
qmlapp.asynFilesLoader.run(paths,"image",isRecurrence,onAddImages)
}
//
function onAddImages(paths) {
for(let i in paths) {
filesTableView.add({ path: paths[i], time: "", state: "" })
}
}

7
UmiOCR-data/qt_res/qml/TabPages/QRCode/QRCode.qml

@ -57,9 +57,12 @@ TabPage {
}
}
//
//
function scanPaths(paths) {
paths = qmlapp.utilsConnector.findImages(paths, false)
qmlapp.asynFilesLoader.run(paths,"image",false,onScanPaths)
}
//
function onScanPaths(paths) {
if(!paths || paths.length < 1) {
qmlapp.popup.simple(qsTr("无有效图片"), "")
return

7
UmiOCR-data/qt_res/qml/TabPages/ScreenshotOCR/ScreenshotOCR.qml

@ -84,9 +84,12 @@ TabPage {
}
}
// OCR
//
function ocrPaths(paths) {
paths = qmlapp.utilsConnector.findImages(paths, false)
qmlapp.asynFilesLoader.run(paths,"image",false,onAddImages)
}
// OCR
function onAddImages(paths) {
if(!paths || paths.length < 1) {
qmlapp.popup.simple(qsTr("无有效图片"), "")
return

Loading…
Cancel
Save