当文件夹名称上有特殊字符时无法读取图像

Failed to read images when folder has special characters on name

基本上我使用的是 locateOnScreen() 函数,它来自 pyautogui 来读取图像,然后通过以下方式在屏幕中查找:

import os
import pathlib
import pyautogui

Image = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), 'static', 'img', 'game', 'image-btn.png')

if pyautogui.locateOnScreen(BossImg, grayscale=True, confidence=0.95) != None:
    print(True)

上面的代码工作得很好,问题是一些用户,甚至是我,因为我的母语是葡萄牙语,我们在语言中有特殊字符,我们可能在文件夹名称中有一些。
让我们使用这个例子:

英文:

C:\Users\guilh\Desktop\Folder

葡萄牙语:

C:\Users\guilh\Área de Trabalho\Folder

所以在某些情况下,当我们得到一个带有重音字符的文件夹时,我会收到错误消息:

Failed to read C:\Users\guilh\Área de Trabalho\Folder\image-btn.png because file is missing, has improper permissions, or is an unsupported or invalid format

但是,如果我使用 pathlibos 正确传递路径,为什么我会收到特殊字符的错误消息?如果我 运行 English 示例中的相同脚本,将完美运行。

在 Github 上对 PyAutoGUI 的源代码进行了一些挖掘后,PyScreeze 似乎用于从屏幕上的图像中检测元素,并且它使用 openCV 的 imread() 函数来加载图像。

cv2.imread() 当前不支持在 Windows.

上包含 Non-ASCII 个字符的路径名

已在 PyScreeze 存储库中打开 pull-request 以使用 cv2.imdecode() 而不是 cv2.imread()


要在等待对 non-ASCII 个字符的支持时解决此问题,

方法一

第一个选项是修改安装的 PyScreeze 包(如果有人需要能够从他们的计算机轻松 运行 脚本,这可能会很烦人)。

- 确定 PyScreeze 模块的位置:

python -c "import pyscreeze; print(pyscreeze.__path__)"

- 修改位于此文件夹中的 __init__.py

第 21 行,

import numpy as np

第 166 行,

img_cv = cv2.imdecode(np.fromfile(img, dtype=np.uint8), LOAD_GRAYSCALE)

第 168 行,

img_cv = cv2.imdecode(np.fromfile(img, dtype=np.uint8), LOAD_COLOR)

- 最后安装 numpy

pip install numpy

方法二

@SiP 所述,另一种可能是将图像复制到临时文件夹。

类似的东西:

import os
import pathlib
import tempfile
import shutil
import pyautogui

Image = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), 'static', 'img', 'game', 'image-btn.png')
temp_path = os.path.join(tempfile.gettempdir(), "file_name_in_ascii")
shutil.copy2(Image, temp_path)

if pyautogui.locateOnScreen(temp_path, grayscale=True, confidence=0.95) is not None:
    print(True)