Skip to content

Commit

Permalink
1080p adapted;
Browse files Browse the repository at this point in the history
  • Loading branch information
SkeathyTomas committed Aug 3, 2022
1 parent 6a6ee2a commit 665e717
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 39 deletions.
56 changes: 40 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,75 @@

## 简介

帮你在游戏中整理圣遗物背包时更便捷地了解、查阅圣遗物的评分。[demo视频](https://www.bilibili.com/video/BV1XB4y1k7au/)
帮你在游戏中整理圣遗物背包时更便捷地了解、查阅圣遗物的评分,然后把评分最高的圣遗物装配给希望的角色[demo视频](https://www.bilibili.com/video/BV1XB4y1k7au/)

![使用截图](https://raw.githubusercontent.com/SkeathyTomas/img/main/img/20220801125435.png)

## 环境与准备

1. Python 3 (开发环境Python 3.10.5)。
2. OCR引擎[tesserect](https://github.com/tesseract-ocr/tesseract),安装过程详见原项目。如果你使用`scoop`,可以使用`scoop install tesseract`快速安装。
3. [tesseract中文简体数据文件](https://github.com/tesseract-ocr/tessdata/blob/main/chi_sim.traineddata),下载完成后保存到tesseLract数据目录(如果是`scoop`安装的话,放在`./scoop/persist/tesseract/tessdata`文件夹中)。
4. 必备的Python包:
### OCR引擎

1. OCR引擎[tesserect](https://github.com/tesseract-ocr/tesseract),安装过程详见原项目,或者参考[这篇文章](https://www.jianshu.com/p/f7cb0b3f337a),安装链接[tesseract-ocr-w64-setup-v5.2.0.20220712.exe](https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.2.0.20220712.exe)(64位)。如果你使用`scoop`,可以使用`scoop install tesseract`快速安装。安装完成后,可在命令行输入`tesseract`检验是否安装成功。
2. [tesseract中文简体数据文件](https://github.com/tesseract-ocr/tessdata/blob/main/chi_sim.traineddata),下载完成后保存到tesseract数据目录`tessdata`中(如果是`scoop`安装的话,放在`./scoop/persist/tesseract/tessdata`文件夹中)。

### 如果你需要直接运行python程序

1. Python 3.6+ (作者开发环境Python 3.10.5)。
2. 必备的Python包:
1. PySide6,GUI框架
2. pynput,监听窗口外鼠标操作
3. pywin32,获取设备分辨率、缩放信息,用于兼容不同分辨率
4. Pillow,截图
5. pytesseract,tesseract的python接口

### 使用打包的exe文件

1. 在release中下载最新的压缩包。
2. 解压。

*注:同样需要安装OCR引擎。*

## 使用教程

1. 使用管理员模式打开命令行工具(必须,否则程序运行中无法监听游戏中的鼠标操作),并打开程序目录。
2. 使用命令`python app.py`运行程序。
3. 在主窗口中选择角色(不选的话,默认评估双爆+攻击词条)。
4. 打开游戏,调整窗口大小为非全屏下最大的一档(当前适配了2560*1600分辨率)。(因为全屏状态下评分结果贴图无法置顶。)
5. 打开背包-圣遗物,随意选择圣遗物,点击**右键**进行圣遗物评分,评分结果随后标记在对应圣遗物右下角。(暂未对滚动条进行适配,若下拉滚动条使第一行圣遗物显示不全,贴图结果可能会有偏离。)
6. 选中某个贴图结果,使用快捷键`Z`删除该贴图;使用全局快捷键`Ctrl+Z`删除所有贴图,可进行新一批圣遗物的评估。
1. 找到并用管理员模式运行keqing.exe(必须,否则程序运行中无法监听游戏中的鼠标操作)。 | 使用管理员模式打开命令行工具(必须,否则程序运行中无法监听游戏中的鼠标操作),并打开程序目录,使用命令`python app.py`运行程序。
2. 在主窗口中选择角色(不选的话,默认评估双爆+攻击词条)。
3. 打开游戏,调整窗口大小为非全屏下最大的一档(当前适配了2560*1600分辨率)。(因为全屏状态下评分结果贴图无法置顶。)
4. 打开背包-圣遗物,随意选择圣遗物,点击**右键**进行圣遗物评分,评分结果随后标记在对应圣遗物右下角。(暂未对滚动条进行适配,若下拉滚动条使第一行圣遗物显示不全,贴图结果可能会有偏离。)
5. 选中某个贴图结果,使用快捷键`Z`删除该贴图;使用全局快捷键`Ctrl+Z`删除所有贴图,可进行新一批圣遗物的评估。

## 评分方法

参考[圣遗物评分方法](https://mp.weixin.qq.com/s/EUc-o95gpovHv5ctKaQNFw)。具体每一个角色的有效词条和词条的评分系数可参考[img_process.py](img_process.py)中的配置,如与需求不符可自行修改参数
参考[圣遗物评分方法](https://mp.weixin.qq.com/s/EUc-o95gpovHv5ctKaQNFw)。具体每一个角色的有效词条和词条的评分系数可参考[img_process.py](img_process.py)中的配置,如与需求不符可自行前往源文件修改参数

## 已知问题

### 分辨率适配

当前仅在自己的机子上做了分辨率适配,所以理论上只有2560*1600分辨率下可以较为正常的运行。不过分辨率适配框架已经搭好,就差热心玩家给一些不同分辨率的截图做坐标定位和测试了。
当前仅在自己的机子上做了分辨率适配,所以理论上只有2560*1600分辨率下可以较为正常的运行。不过分辨率适配框架已经搭好,就差热心玩家给一些不同分辨率的截图做坐标定位和测试了。需要把游戏窗口化为非全屏下最大的一档,打开背包-圣遗物,别去调窗口位置,然后全屏截图私发一下我。

需要把游戏窗口化为非全屏下最大的一档,打开背包-圣遗物,别去调窗口位置,然后全屏截图私发一下我。
目前已适配分辨率:

- [x] 2560 * 1600
- [x] 1920 * 1080

### 能不能在圣遗物装配中使用

本来一开始确实是按照这个开发的,后来发现这个界面识别老是出错。背景飘过的白点和文字重叠基本就识别不出来了,所以基本就放弃了。
本来一开始确实是按照这个开发的,后来发现这个界面识别老是出错。背景飘过的白点和文字重叠基本就识别不出来了,所以放弃了。

有兴趣可以运行`python test/app_character.py`尝试下效果,当然角色配置还未同步过去。

### 关于GUI

有兴趣可以运行`python app_character.py`尝试下效果,当然角色配置还未同步过去。
Bug一堆,问就是还在学,不过用着应该没什么问题。

### 语言支持

- [x] 中文简体

## 风险和声明

本程序不收集任何用户信息,所有数据保留在本地。

理论上未对任何游戏数据进行非法获取和修改,仅通过截图和OCR技术实现相关分析,且没有使用自动化程序帮助玩家获取游戏内资源,应该不在官方打击范围。

如若官方觉得不妥,我就删库跑路。
Expand Down
77 changes: 57 additions & 20 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import sys

import sys, os
import win32con, win32api, win32gui, win32print
from pynput import mouse, keyboard
import img_process

from PySide6.QtCore import Qt, Signal, QObject, QSortFilterProxyModel
from PySide6.QtGui import QKeySequence, QShortcut, QIcon
from PySide6.QtCore import Qt, Signal, QObject, QSortFilterProxyModel, QUrl
from PySide6.QtGui import QKeySequence, QShortcut, QIcon, QPixmap, QDesktopServices
from PySide6.QtWidgets import (
QApplication,
QLabel,
Expand All @@ -14,6 +13,7 @@
QComboBox,
QWidget,
QVBoxLayout,
QGridLayout,
QCompleter
)

Expand All @@ -22,13 +22,14 @@ class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setWindowIcon(QIcon('src/avatar/keqing.png'))
self.setWindowIcon(QIcon(os.path.join(os.path.dirname(__file__), 'src/keqing.ico')))
self.setWindowTitle("刻晴办公桌")
self.move(0, 0)
self.character = ''

# 主窗口内容
# 选择框
self.combobox = ExtendedComboBox()
self.combobox.currentTextChanged.connect(self.current_text_changed)
self.combobox.addItem('--请选择角色--')

# 风
Expand Down Expand Up @@ -101,8 +102,23 @@ def __init__(self):

# 草

self.setCentralWidget(self.combobox)
self.combobox.currentTextChanged.connect(self.current_text_changed)
# 图标
self.label = QLabel()
self.label.setFixedSize(16, 16)
pixmap = QPixmap('src/GitHub.png')
pixmap = pixmap.scaled(16, 16)
self.label.setPixmap(pixmap)
self.label.setCursor(Qt.PointingHandCursor)
self.label.mousePressEvent = self.open_github

# layout
self.layout = QGridLayout()
self.layout.addWidget(self.combobox, 0, 0)
self.layout.addWidget(self.label, 1, 0, Qt.AlignRight | Qt.AlignBottom)

self.widget = QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)

# 预先设定好贴图窗口组
self.pastes = []
Expand All @@ -122,6 +138,10 @@ def __init__(self):
def current_text_changed(self, s):
self.character = s

# 打开外部链接
def open_github(self, event):
QDesktopServices.openUrl(QUrl('https://github.com/SkeathyTomas/genshin_artifact_auxiliary'))

# 启动贴图弹窗
def open_new_window(self, x, y):
# 贴图坐标组
Expand Down Expand Up @@ -185,7 +205,7 @@ class ExtendedComboBox(QComboBox):
def __init__(self, parent=None):
super(ExtendedComboBox, self).__init__(parent)

self.setFocusPolicy(Qt.StrongFocus)
self.setFocusPolicy(Qt.ClickFocus)
self.setEditable(True)
self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert)

Expand Down Expand Up @@ -239,9 +259,9 @@ def __init__(self):
self.label = QLabel('E!')
# 字体大小
font = self.label.font()
font.setPointSize(8)
font.setPointSize(14 // SCALE)
self.label.setFont(font)
self.label.setFixedSize(48 // SCALE, 48 // SCALE)
self.label.setFixedSize(36 // SCALE, 36 // SCALE)
self.label.setAlignment(Qt.AlignCenter)
# qss = 'border-image: url(paste.png);'
qss = 'background-color: rgb(255, 255, 255)'
Expand All @@ -268,24 +288,41 @@ def _handle_click(self, x, y, button, pressed):
self.released.emit(x, y)

def main():
# 手动解决一些缩放问题
# 手动解决一些不同缩放情况下窗口定位的问题
# QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
global SCALE
hDC = win32gui.GetDC(0)
width_r = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
height_r = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
width_s = win32api.GetSystemMetrics(0)
print(width_r, height_r)
SCALE = width_r / width_s

# 分辨率适配
global x_initial, y_initial, x_offset, y_offset
global x_left, x_right, y_top, y_bottom
global x_grab, y_grab, w_grab, h_grab
# 默认2560*1600
x_initial, y_initial, x_offset, y_offset = (490, 320, 156, 188)
x_left, x_right, y_top, y_bottom = (382, 512, 182, 346)
x_grab, y_grab, w_grab, h_grab = (1684, 560, 350, 168)
global x_initial, y_initial, x_offset, y_offset # 第一个贴图坐标及偏移
global x_left, x_right, y_top, y_bottom # 第一个圣遗物坐标
global x_grab, y_grab, w_grab, h_grab # 截图w, y, w, h
# 2560*1600
if width_r == 2560 and height_r == 1600:
x_initial, y_initial, x_offset, y_offset = (490, 320, 156, 188)
x_left, x_right, y_top, y_bottom = (382, 512, 182, 346)
x_grab, y_grab, w_grab, h_grab = (1684, 560, 350, 168)
# 1920*1080
elif width_r == 1920 and height_r == 1080:
x_initial, y_initial, x_offset, y_offset = (310, 242, 128, 152)
x_left, x_right, y_top, y_bottom = (223, 333, 132, 267)
x_grab, y_grab, w_grab, h_grab = (1283, 437, 308, 141)
else:
print('暂不支持该分辨率,请联系作者。')

# 任务栏图标问题
try:
from ctypes import windll # Only exists on Windows.
myappid = 'skeathy.keqing.v0.1.0'
windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
pass

# QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
Expand Down
9 changes: 6 additions & 3 deletions img_process.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,12 @@ def cal_score(txt, character):

def main(character, x, y, w, h):
print(character)
txt = ocr(x, y, w, h)
score = cal_score(txt, character)
return score
try:
txt = ocr(x, y, w, h)
score = cal_score(txt, character)
return score
except:
print('未检测到tesseract引擎')

if __name__ == '__main__':
main(character)
Binary file added src/GitHub.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/keqing.ico
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes

0 comments on commit 665e717

Please sign in to comment.