这是一个经典的 BGR vs RGB 通道顺序问题!
原因分析
iOS 的 device().snapshot() 返回的 numpy 数组是 BGR 格式 (OpenCV 约定),但 Image.fromarray() 期望的是 RGB 格式(PIL 约定)。直接把 BGR 数据传给 PIL,R 和 B 通道就互换了:
- 屏幕上的蓝色 (B=255, G=0, R=0) → 被当成 (R=255, G=0, B=0) → 显示为红色/橙色
- 屏幕上的红色 → 被当成蓝色
修复方案
在 _save_screenshot() 中,Image.fromarray() 之前需要做 BGR→RGB 转换:
python
# 修改前
pil_img = Image.fromarray(screen)
# 修改后
import numpy as np
screen_rgb = screen[:, :, ::-1].copy() # BGR → RGB
pil_img = Image.fromarray(screen_rgb)
[:, :, ::-1] 就是反转第3维(通道),BGR→RGB。.copy() 确保内存连续。
注意:如果 snapshot() 返回的已经是 PIL Image(RGB),则不需要转换,现有代码已经用 isinstance(screen, Image.Image) 判断了。