这是一个经典的 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 转换:

# 修改前
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) 判断了。

更多推荐