LmeSzinc / AzurLaneAutoScript

Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界
https://alas.azurlane.cloud
GNU General Public License v3.0
6.97k stars 836 forks source link

Alas报错UnidentifiedImageError #4385

Open AutumnSun1996 opened 6 days ago

AutumnSun1996 commented 6 days ago

在提问之前...

描述你的问题

使用 python gui.py 运行时,出现报错 UnidentifiedImageError. 回退到 bc5e6ed86a7e004141fdaf80636d3e164163a856 版本后可以正常执行,因此推测问题来自PR #4374

如何复现

  1. 启动 Alas: python gui.py
  2. 前往Web页面,开始运行
  3. 出现问题

预期行为

预期可以正常运行

相关 Logs

╭───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:69 in run                                  │
│                                                                                                                     │
│    66 │   │   try:                                                                                                  │
│    67 │   │   │   if not skip_first_screenshot:                                                                     │
│    68 │   │   │   │   self.device.screenshot()                                                                      │
│ ❱  69 │   │   │   self.__getattribute__(command)()                                                                  │
│    70 │   │   │   return True                                                                                       │
│    71 │   │   except TaskEnd:                                                                                       │
│    72 │   │   │   return True                                                                                       │
│                                                                                                                     │
│ ╭──────────────────────────────────── locals ────────────────────────────────────╮                                  │
│ │               command = 'tactical'                                             │                                  │
│ │                  self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608> │                                  │
│ │ skip_first_screenshot = False                                                  │                                  │
│ ╰────────────────────────────────────────────────────────────────────────────────╯                                  │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:194 in tactical                            │
│                                                                                                                     │
│   191 │                                                                                                             │
│   192 │   def tactical(self):                                                                                       │
│   193 │   │   from module.tactical.tactical_class import RewardTacticalClass                                        │
│ ❱ 194 │   │   RewardTacticalClass(config=self.config, device=self.device).run()                                     │
│   195 │                                                                                                             │
│   196 │   def dorm(self):                                                                                           │
│   197 │   │   from module.dorm.dorm import RewardDorm                                                               │
│                                                                                                                     │
│ ╭────────────────────────────────────── locals ──────────────────────────────────────╮                              │
│ │ RewardTacticalClass = <class 'module.tactical.tactical_class.RewardTacticalClass'> │                              │
│ │                self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608>       │                              │
│ ╰────────────────────────────────────────────────────────────────────────────────────╯                              │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\tactical\tactical_class.py:706 in run       │
│                                                                                                                     │
│   703 │   │   │   in: Any                                                                                           │
│   704 │   │   │   out: page_tactical                                                                                │
│   705 │   │   """                                                                                                   │
│ ❱ 706 │   │   self.ui_ensure(page_reward)                                                                           │
│   707 │   │                                                                                                         │
│   708 │   │   self.tactical_class_receive()                                                                         │
│   709                                                                                                               │
│                                                                                                                     │
│ ╭───────────────────────────────────────── locals ─────────────────────────────────────────╮                        │
│ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │                        │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────╯                        │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:280 in ui_ensure                   │
│                                                                                                                     │
│   277 │   │   │   bool: If UI switched.                                                                             │
│   278 │   │   """                                                                                                   │
│   279 │   │   logger.hr("UI ensure")                                                                                │
│ ❱ 280 │   │   self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot)                                 │
│   281 │   │   if self.ui_current == destination:                                                                    │
│   282 │   │   │   logger.info("Already at %s" % destination)                                                        │
│   283 │   │   │   return False                                                                                      │
│                                                                                                                     │
│ ╭───────────────────────────────────────────────── locals ──────────────────────────────────────────────────╮       │
│ │           destination = <module.ui.page.Page object at 0x000001C1D128B9C8>                                │       │
│ │                  self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │       │
│ │ skip_first_screenshot = True                                                                              │       │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯       │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:189 in ui_get_current_page         │
│                                                                                                                     │
│   186 │   │   │   for page in Page.iter_pages():                                                                    │
│   187 │   │   │   │   if page.check_button is None:                                                                 │
│   188 │   │   │   │   │   continue                                                                                  │
│ ❱ 189 │   │   │   │   if self.ui_page_appear(page=page):                                                            │
│   190 │   │   │   │   │   logger.attr("UI", page.name)                                                              │
│   191 │   │   │   │   │   self.ui_current = page                                                                    │
│   192 │   │   │   │   │   return page                                                                               │
│                                                                                                                     │
│ ╭───────────────────────────────────────────────── locals ──────────────────────────────────────────────────╮       │
│ │             app_check = <function run_once.<locals>.wrapper at 0x000001C1D1729798>                        │       │
│ │         minicap_check = <function run_once.<locals>.wrapper at 0x000001C1D1738168>                        │       │
│ │                  page = <module.ui.page.Page object at 0x000001C1D123DE88>                                │       │
│ │        rotation_check = <function run_once.<locals>.wrapper at 0x000001C1D1738288>                        │       │
│ │                  self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │       │
│ │ skip_first_screenshot = False                                                                             │       │
│ │               timeout = Timer(limit=4.832/10, count=1/20)                                                 │       │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯       │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:36 in ui_page_appear               │
│                                                                                                                     │
│    33 │   │   │   interval:                                                                                         │
│    34 │   │   """                                                                                                   │
│    35 │   │   if page == page_main:                                                                                 │
│ ❱  36 │   │   │   if self.appear(page_main_white.check_button, offset=offset,                                       │
│       interval=interval):                                                                                           │
│    37 │   │   │   │   return True                                                                                   │
│    38 │   │   │   if self.appear(page_main.check_button, offset=(5, 5), interval=interval):                         │
│    39 │   │   │   │   return True                                                                                   │
│                                                                                                                     │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮                    │
│ │ interval = 0                                                                                 │                    │
│ │   offset = (30, 30)                                                                          │                    │
│ │     page = <module.ui.page.Page object at 0x000001C1D123DE88>                                │                    │
│ │     self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │                    │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯                    │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\base.py:171 in appear                  │
│                                                                                                                     │
│   168 │   │   │   if isinstance(offset, bool):                                                                      │
│   169 │   │   │   │   offset = self.config.BUTTON_OFFSET                                                            │
│   170 │   │   │   appear = button.match(self.device.image, offset=offset,                                           │
│ ❱ 171 │   │   │   │   │   │   │   │     threshold=self.config.BUTTON_MATCH_SIMILARITY if                            │
│       threshold is None else threshold)                                                                             │
│   172 │   │   else:                                                                                                 │
│   173 │   │   │   appear = button.appear_on(self.device.image,                                                      │
│   174 │   │   │   │   │   │   │   │   │     threshold=self.config.COLOR_SIMILAR_THRESHOLD if                        │
│       threshold is None else threshold)                                                                             │
│                                                                                                                     │
│ ╭─────────────────────────────────────────── locals ────────────────────────────────────────────╮                   │
│ │    button = MAIN_GOTO_CAMPAIGN_WHITE                                                          │                   │
│ │  interval = 0                                                                                 │                   │
│ │    offset = (30, 30)                                                                          │                   │
│ │      self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │                   │
│ │ threshold = None                                                                              │                   │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯                   │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\button.py:212 in match                 │
│                                                                                                                     │
│   209 │   │   Returns:                                                                                              │
│   210 │   │   │   bool.                                                                                             │
│   211 │   │   """                                                                                                   │
│ ❱ 212 │   │   self.ensure_template()                                                                                │
│   213 │   │                                                                                                         │
│   214 │   │   if isinstance(offset, tuple):                                                                         │
│   215 │   │   │   if len(offset) == 2:                                                                              │
│                                                                                                                     │
│ ╭────────────────────── locals ───────────────────────╮                                                             │
│ │     image = array([[[214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [214, 211, 231],                │                                                             │
│ │             │   │   [214, 211, 239],                │                                                             │
│ │             │   │   [198, 203, 231]],               │                                                             │
│ │             │                                       │                                                             │
│ │             │      [[214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [214, 211, 231],                │                                                             │
│ │             │   │   [214, 215, 239],                │                                                             │
│ │             │   │   [198, 203, 231]],               │                                                             │
│ │             │                                       │                                                             │
│ │             │      [[214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   [214, 158, 182],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [214, 211, 231],                │                                                             │
│ │             │   │   [214, 211, 231],                │                                                             │
│ │             │   │   [198, 203, 231]],               │                                                             │
│ │             │                                       │                                                             │
│ │             │      ...,                             │                                                             │
│ │             │                                       │                                                             │
│ │             │      [[ 58,  57,  50],                │                                                             │
│ │             │   │   [ 58,  53,  50],                │                                                             │
│ │             │   │   [ 66,  57,  50],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [ 50,  49,  50],                │                                                             │
│ │             │   │   [ 50,  53,  50],                │                                                             │
│ │             │   │   [ 50,  49,  50]],               │                                                             │
│ │             │                                       │                                                             │
│ │             │      [[ 58,  53,  58],                │                                                             │
│ │             │   │   [ 58,  53,  58],                │                                                             │
│ │             │   │   [ 58,  53,  58],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [ 50,  49,  50],                │                                                             │
│ │             │   │   [ 50,  49,  50],                │                                                             │
│ │             │   │   [ 50,  49,  50]],               │                                                             │
│ │             │                                       │                                                             │
│ │             │      [[ 66,  61,  66],                │                                                             │
│ │             │   │   [ 58,  57,  58],                │                                                             │
│ │             │   │   [ 58,  61,  58],                │                                                             │
│ │             │   │   ...,                            │                                                             │
│ │             │   │   [ 50,  49,  58],                │                                                             │
│ │             │   │   [ 50,  53,  58],                │                                                             │
│ │             │   │   [ 50,  49,  58]]], dtype=uint8) │                                                             │
│ │    offset = (30, 30)                                │                                                             │
│ │      self = MAIN_GOTO_CAMPAIGN_WHITE                │                                                             │
│ │ threshold = 0.85                                    │                                                             │
│ ╰─────────────────────────────────────────────────────╯                                                             │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\button.py:161 in ensure_template       │
│                                                                                                                     │
│   158 │   │   │   │   │   image = crop(image, self.area)                                                            │
│   159 │   │   │   │   │   self.image.append(image)                                                                  │
│   160 │   │   │   else:                                                                                             │
│ ❱ 161 │   │   │   │   self.image = load_image(self.file, self.area)                                                 │
│   162 │   │   │   self._match_init = True                                                                           │
│   163 │                                                                                                             │
│   164 │   def ensure_binary_template(self):                                                                         │
│                                                                                                                     │
│ ╭──────────── locals ─────────────╮                                                                                 │
│ │ self = MAIN_GOTO_CAMPAIGN_WHITE │                                                                                 │
│ ╰─────────────────────────────────╯                                                                                 │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\utils.py:511 in load_image             │
│                                                                                                                     │
│   508 │   Returns:                                                                                                  │
│   509 │   │   np.ndarray:                                                                                           │
│   510 │   """                                                                                                       │
│ ❱ 511 │   image = Image.open(file)                                                                                  │
│   512 │   if area is not None:                                                                                      │
│   513 │   │   image = image.crop(area)                                                                              │
│   514 │   image = np.array(image)                                                                                   │
│                                                                                                                     │
│ ╭────────────────────────── locals ──────────────────────────╮                                                      │
│ │ area = (1132, 529, 1187, 557)                              │                                                      │
│ │ file = './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png' │                                                      │
│ ╰────────────────────────────────────────────────────────────╯                                                      │
│                                                                                                                     │
│ D:\Software\anaconda3\envs\alas\lib\site-packages\PIL\Image.py:3024 in open                                         │
│                                                                                                                     │
│   3021 │   for message in accept_warnings:                                                                          │
│   3022 │   │   warnings.warn(message)                                                                               │
│   3023 │   raise UnidentifiedImageError(                                                                            │
│ ❱ 3024 │   │   "cannot identify image file %r" % (filename if filename else fp)                                     │
│   3025 │   )                                                                                                        │
│   3026                                                                                                              │
│   3027                                                                                                              │
│                                                                                                                     │
│ ╭──────────────────────────────────────────── locals ─────────────────────────────────────────────╮                 │
│ │      _open_core = <function open.<locals>._open_core at 0x000001C1D17820D8>                     │                 │
│ │ accept_warnings = []                                                                            │                 │
│ │    exclusive_fp = True                                                                          │                 │
│ │        filename = './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png'                           │                 │
│ │         formats = []                                                                            │                 │
│ │              fp = <_io.BufferedReader name='./assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png'> │                 │
│ │              im = None                                                                          │                 │
│ │            mode = 'r'                                                                           │                 │
│ │          prefix = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR'                                        │                 │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯                 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
UnidentifiedImageError: cannot identify image file './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png'                 

During handling of the above exception, another exception occurred:                                                    

╭───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\webui\process_manager.py:162 in run_process │
│                                                                                                                     │
│   159 │   │   │   │                                                                                                 │
│   160 │   │   │   │   if e is not None:                                                                             │
│   161 │   │   │   │   │   AzurLaneAutoScript.stop_event = e                                                         │
│ ❱ 162 │   │   │   │   AzurLaneAutoScript(config_name=config_name).loop()                                            │
│   163 │   │   │   elif func in get_available_func():                                                                │
│   164 │   │   │   │   from alas import AzurLaneAutoScript                                                           │
│   165                                                                                                               │
│                                                                                                                     │
│ ╭──────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │
│ │                  _ = []                                                                                         │ │
│ │               args = Namespace(electron=False)                                                                  │ │
│ │ AzurLaneAutoScript = <class 'alas.AzurLaneAutoScript'>                                                          │ │
│ │     AzurLaneConfig = <class 'module.config.config.AzurLaneConfig'>                                              │ │
│ │        config_name = 'alas'                                                                                     │ │
│ │                  e = UnidentifiedImageError("cannot identify image file './assets/cn/ui/PLAYER_CHECK.png'")     │ │
│ │               func = 'alas'                                                                                     │ │
│ │             parser = ArgumentParser(prog='patcher.py', usage=None, description=None, formatter_class=<class     │ │
│ │                      'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)                        │ │
│ │                  q = <AutoProxy[Queue] object, typeid 'Queue' at 0x1c1d15cf348>                                 │ │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:537 in loop                                │
│                                                                                                                     │
│   534 │   │   │   self.device.stuck_record_clear()                                                                  │
│   535 │   │   │   self.device.click_record_clear()                                                                  │
│   536 │   │   │   logger.hr(task, level=0)                                                                          │
│ ❱ 537 │   │   │   success = self.run(inflection.underscore(task))                                                   │
│   538 │   │   │   logger.info(f'Scheduler: End task `{task}`')                                                      │
│   539 │   │   │   self.is_first_task = False                                                                        │
│   540                                                                                                               │
│                                                                                                                     │
│ ╭───────────────────────────── locals ──────────────────────────────╮                                               │
│ │    _ = <module.device.device.Device object at 0x000001C1D16584C8> │                                               │
│ │ self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608>     │                                               │
│ │ task = 'Tactical'                                                 │                                               │
│ ╰───────────────────────────────────────────────────────────────────╯                                               │
│                                                                                                                     │
│ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:127 in run                                 │

截图

No response

还有别的吗?

State.deploy_config.EnableReload 为True, 因此gui.py中会使用multiprocessing方式运行,可能和问题相关

unknowr commented 4 days ago

我也有相同的问题

AutumnSun1996 commented 3 days ago

似乎和import顺序有关,试了下将module.xxx的import全部移动到func内部之后可以正常运行了