diff --git a/ui/designer/components/ocrQueue.ui b/ui/designer/components/ocrQueue.ui index 03980ad..3c85a0e 100644 --- a/ui/designer/components/ocrQueue.ui +++ b/ui/designer/components/ocrQueue.ui @@ -6,8 +6,8 @@ 0 0 - 741 - 372 + 650 + 400 @@ -17,13 +17,46 @@ - ocr.queue.title + queue.title + + + + iccOptionsGroupBox + + + + + + icc.ignore + + + + + + + icc.usePIL + + + true + + + + + + + icc.tryFix + + + + + + - ocr.queue.addImageButton + queue.addImageButton @@ -33,7 +66,7 @@ true - ocr.queue.removeSelected + queue.removeSelected @@ -43,7 +76,7 @@ true - ocr.queue.removeAll + queue.removeAll @@ -63,7 +96,7 @@ - ocr.queue.startOcrButton + queue.startOcrButton @@ -115,7 +148,7 @@ - ocr.results + results @@ -124,14 +157,14 @@ true - ocr.results.acceptSelectedButton + results.acceptSelectedButton - ocr.results.acceptAllButton + results.acceptAllButton @@ -151,7 +184,7 @@ - ocr.results.ignoreValidate + results.ignoreValidate diff --git a/ui/designer/components/ocrQueue_ui.py b/ui/designer/components/ocrQueue_ui.py index cccc531..2155d22 100644 --- a/ui/designer/components/ocrQueue_ui.py +++ b/ui/designer/components/ocrQueue_ui.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'ocrQueue.ui' ## -## Created by: Qt User Interface Compiler version 6.5.1 +## Created by: Qt User Interface Compiler version 6.5.2 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -17,14 +17,14 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QAbstractItemView, QApplication, QCheckBox, QGroupBox, QHBoxLayout, QHeaderView, QProgressBar, QPushButton, - QSizePolicy, QSpacerItem, QTableView, QVBoxLayout, - QWidget) + QRadioButton, QSizePolicy, QSpacerItem, QTableView, + QVBoxLayout, QWidget) class Ui_OcrQueue(object): def setupUi(self, OcrQueue): if not OcrQueue.objectName(): OcrQueue.setObjectName(u"OcrQueue") - OcrQueue.resize(741, 372) + OcrQueue.resize(650, 400) OcrQueue.setWindowTitle(u"OcrQueue") self.horizontalLayout_2 = QHBoxLayout(OcrQueue) self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") @@ -32,6 +32,29 @@ class Ui_OcrQueue(object): self.groupBox_3.setObjectName(u"groupBox_3") self.verticalLayout_2 = QVBoxLayout(self.groupBox_3) self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.groupBox = QGroupBox(self.groupBox_3) + self.groupBox.setObjectName(u"groupBox") + self.verticalLayout = QVBoxLayout(self.groupBox) + self.verticalLayout.setObjectName(u"verticalLayout") + self.iccIgnoreRadioButton = QRadioButton(self.groupBox) + self.iccIgnoreRadioButton.setObjectName(u"iccIgnoreRadioButton") + + self.verticalLayout.addWidget(self.iccIgnoreRadioButton) + + self.iccUsePILRadioButton = QRadioButton(self.groupBox) + self.iccUsePILRadioButton.setObjectName(u"iccUsePILRadioButton") + self.iccUsePILRadioButton.setChecked(True) + + self.verticalLayout.addWidget(self.iccUsePILRadioButton) + + self.iccTryFixRadioButton = QRadioButton(self.groupBox) + self.iccTryFixRadioButton.setObjectName(u"iccTryFixRadioButton") + + self.verticalLayout.addWidget(self.iccTryFixRadioButton) + + + self.verticalLayout_2.addWidget(self.groupBox) + self.ocr_addImageButton = QPushButton(self.groupBox_3) self.ocr_addImageButton.setObjectName(u"ocr_addImageButton") @@ -120,15 +143,19 @@ class Ui_OcrQueue(object): # setupUi def retranslateUi(self, OcrQueue): - self.groupBox_3.setTitle(QCoreApplication.translate("OcrQueue", u"ocr.queue.title", None)) - self.ocr_addImageButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.addImageButton", None)) - self.ocr_removeSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.removeSelected", None)) - self.ocr_removeAllButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.removeAll", None)) - self.ocr_startButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.startOcrButton", None)) - self.groupBox_5.setTitle(QCoreApplication.translate("OcrQueue", u"ocr.results", None)) - self.ocr_acceptSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.results.acceptSelectedButton", None)) - self.ocr_acceptAllButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.results.acceptAllButton", None)) - self.ocr_ignoreValidateCheckBox.setText(QCoreApplication.translate("OcrQueue", u"ocr.results.ignoreValidate", None)) + self.groupBox_3.setTitle(QCoreApplication.translate("OcrQueue", u"queue.title", None)) + self.groupBox.setTitle(QCoreApplication.translate("OcrQueue", u"iccOptionsGroupBox", None)) + self.iccIgnoreRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.ignore", None)) + self.iccUsePILRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.usePIL", None)) + self.iccTryFixRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.tryFix", None)) + self.ocr_addImageButton.setText(QCoreApplication.translate("OcrQueue", u"queue.addImageButton", None)) + self.ocr_removeSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"queue.removeSelected", None)) + self.ocr_removeAllButton.setText(QCoreApplication.translate("OcrQueue", u"queue.removeAll", None)) + self.ocr_startButton.setText(QCoreApplication.translate("OcrQueue", u"queue.startOcrButton", None)) + self.groupBox_5.setTitle(QCoreApplication.translate("OcrQueue", u"results", None)) + self.ocr_acceptSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"results.acceptSelectedButton", None)) + self.ocr_acceptAllButton.setText(QCoreApplication.translate("OcrQueue", u"results.acceptAllButton", None)) + self.ocr_ignoreValidateCheckBox.setText(QCoreApplication.translate("OcrQueue", u"results.ignoreValidate", None)) pass # retranslateUi diff --git a/ui/extends/components/ocrQueue.py b/ui/extends/components/ocrQueue.py index fccfb5d..ce608df 100644 --- a/ui/extends/components/ocrQueue.py +++ b/ui/extends/components/ocrQueue.py @@ -1,4 +1,5 @@ import logging +from enum import IntEnum from typing import Any, Callable, Optional, overload from arcaea_offline.calculate import calculate_score_range @@ -6,6 +7,9 @@ from arcaea_offline.database import Database from arcaea_offline.models import Chart, Score from arcaea_offline_ocr.b30.shared import B30OcrResultItem from arcaea_offline_ocr.device.shared import DeviceOcrResult +from arcaea_offline_ocr.utils import convert_to_srgb +from PIL import Image +from PIL.ImageQt import ImageQt from PySide6.QtCore import ( QAbstractListModel, QAbstractTableModel, @@ -41,6 +45,12 @@ class OcrRunnable(QRunnable): self.signals = OcrRunnableSignals() +class IccOption(IntEnum): + Ignore = 0 + UsePIL = 1 + TryFix = 2 + + class OcrQueueModel(QAbstractListModel): ImagePathRole = Qt.ItemDataRole.UserRole + 1 ImageQImageRole = Qt.ItemDataRole.UserRole + 2 @@ -64,6 +74,7 @@ class OcrQueueModel(QAbstractListModel): super().__init__(parent) self.__db = Database() self.__items: list[dict[int, Any]] = [] + self.__iccOption = IccOption.UsePIL self.__taskFinishedNum = 0 @@ -133,6 +144,14 @@ class OcrQueueModel(QAbstractListModel): ) return False + @property + def iccOption(self): + return self.__iccOption + + @iccOption.setter + def iccOption(self, opt: IccOption): + self.__iccOption = opt + @overload def addItem( self, @@ -162,8 +181,17 @@ class OcrQueueModel(QAbstractListModel): logger.warning(f"Attempting to add an invalid file {image}") return imagePath = image - qImage = QImage(image) - qPixmap = QPixmap(image) + if self.iccOption == IccOption.TryFix: + img = Image.open(image) + img = convert_to_srgb(img) + qImage = ImageQt(img) + elif self.iccOption == IccOption.UsePIL: + img = Image.open(image) + qImage = ImageQt(img) + else: + qImage = QImage(image) + + qPixmap = QPixmap(qImage) elif isinstance(image, QImage): imagePath = None qImage = image.copy() diff --git a/ui/implements/components/ocrQueue.py b/ui/implements/components/ocrQueue.py index dbe379b..1b97087 100644 --- a/ui/implements/components/ocrQueue.py +++ b/ui/implements/components/ocrQueue.py @@ -2,7 +2,7 @@ from typing import Optional from PySide6.QtCore import Qt, QTimer, Slot from PySide6.QtGui import QColor, QPalette -from PySide6.QtWidgets import QWidget +from PySide6.QtWidgets import QButtonGroup, QWidget from ui.designer.components.ocrQueue_ui import Ui_OcrQueue from ui.extends.components.ocrQueue import ( @@ -36,6 +36,13 @@ class OcrQueue(Ui_OcrQueue, QWidget): tableViewPalette.setColor(QPalette.ColorRole.Highlight, highlightColor) self.tableView.setPalette(tableViewPalette) + self.iccOptionButtonGroup = QButtonGroup(self) + self.iccOptionButtonGroup.buttonToggled.connect(self.updateIccOption) + self.iccOptionButtonGroup.addButton(self.iccIgnoreRadioButton, 0) + self.iccOptionButtonGroup.addButton(self.iccUsePILRadioButton, 1) + self.iccOptionButtonGroup.addButton(self.iccTryFixRadioButton, 2) + self.updateIccOption() + def model(self): return self.__model @@ -77,6 +84,10 @@ class OcrQueue(Ui_OcrQueue, QWidget): self.ocr_acceptAllButton.setEnabled(__bool) self.ocr_ignoreValidateCheckBox.setEnabled(__bool) + def updateIccOption(self): + if self.model(): + self.model().iccOption = self.iccOptionButtonGroup.checkedId() + def resizeTableView(self): self.tableView.resizeRowsToContents() self.tableView.resizeColumnsToContents() diff --git a/ui/resources/translations/en_US.ts b/ui/resources/translations/en_US.ts index 7b0ae1b..0ab1b42 100644 --- a/ui/resources/translations/en_US.ts +++ b/ui/resources/translations/en_US.ts @@ -215,47 +215,67 @@ OcrQueue - ocr.queue.title + queue.title Queue - ocr.queue.addImageButton + iccOptionsGroupBox + ICC Profile Options + + + + icc.ignore + Ignore + + + + icc.usePIL + Use PIL + + + + icc.tryFix + Try fix + + + + queue.addImageButton Add Image - - ocr.queue.removeSelected + + queue.removeSelected Remove Selected - - ocr.queue.removeAll + + queue.removeAll Remove All - - ocr.queue.startOcrButton + + queue.startOcrButton Start OCR - - ocr.results + + results Results - - ocr.results.acceptSelectedButton + + results.acceptSelectedButton Accept Selected - - ocr.results.acceptAllButton + + results.acceptAllButton Accept All - - ocr.results.ignoreValidate + + results.ignoreValidate Ignore validation @@ -263,22 +283,22 @@ validation OcrTableModel - + horizontalHeader.title.select Select - + horizontalHeader.title.imagePreview Image Preview - + horizontalHeader.title.chart Chart - + horizontalHeader.title.score Score diff --git a/ui/resources/translations/zh_CN.ts b/ui/resources/translations/zh_CN.ts index 110955b..d910597 100644 --- a/ui/resources/translations/zh_CN.ts +++ b/ui/resources/translations/zh_CN.ts @@ -215,69 +215,89 @@ OcrQueue - ocr.queue.title + queue.title 队列 - ocr.queue.addImageButton + iccOptionsGroupBox + ICC 文件选项 + + + + icc.ignore + 忽略 + + + + icc.usePIL + 使用 PIL 读取 + + + + icc.tryFix + 尝试修复 + + + + queue.addImageButton 添加图像文件 - - ocr.queue.removeSelected + + queue.removeSelected 移除选中 - - ocr.queue.removeAll + + queue.removeAll 移除所有 - - ocr.queue.startOcrButton + + queue.startOcrButton 开始 OCR - - ocr.results + + results 结果 - - ocr.results.acceptSelectedButton + + results.acceptSelectedButton 提交选中 - - ocr.results.acceptAllButton + + results.acceptAllButton 提交所有 - - ocr.results.ignoreValidate + + results.ignoreValidate 忽略验证 OcrTableModel - + horizontalHeader.title.select 选择 - + horizontalHeader.title.imagePreview 图像预览 - + horizontalHeader.title.chart 谱面 - + horizontalHeader.title.score 分数