当文件夹名称上有特殊字符时无法读取图像
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
但是,如果我使用 pathlib
和 os
正确传递路径,为什么我会收到特殊字符的错误消息?如果我 运行 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)
基本上我使用的是 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
但是,如果我使用 pathlib
和 os
正确传递路径,为什么我会收到特殊字符的错误消息?如果我 运行 English
示例中的相同脚本,将完美运行。
在 Github 上对 PyAutoGUI
的源代码进行了一些挖掘后,PyScreeze
似乎用于从屏幕上的图像中检测元素,并且它使用 openCV 的 imread()
函数来加载图像。
cv2.imread()
当前不支持在 Windows.
已在 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)