You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Python调用ADB exec-out screencap截图报错问题

解决Windows下Python调用adb截屏后PIL无法识别的问题

这个问题我之前也碰到过,核心原因是Windows系统的换行符转换机制破坏了PNG二进制数据——Mac/Linux用的是Unix风格的\n换行,而Windows默认是\r\n,当你通过subprocess调用adb时,Windows会自动把输出里的\n转换成\r\n,但PNG文件是严格的二进制格式,这种转换直接打乱了文件结构,PIL自然识别不了。

下面是具体的修复方案,分两步:

1. 确保subprocess以二进制模式处理输出

修改你的cmd函数里的subprocess.call调用,加上text=False参数(Python 3.7+适用,旧版本可以用universal_newlines=False),明确告诉subprocess不要做文本模式的换行符转换:

status = subprocess.call(line, stdout=stdout, stderr=stdout, text=False)

2. 修复Windows下的PNG数据换行符

即使指定了二进制模式,部分Windows环境下adb的输出还是会存在多余的\r,所以需要在获取到截图数据后,手动把\r\n替换回\n。修改你的capture函数:

def capture():
    line = [ADB_BIN, 'exec-out', 'screencap', '-p']
    status, output = cmd(line, out_is_binary=True)
    if status:
        raise RuntimeError('通过USB调试截屏失败')
    
    # 针对Windows系统修复换行符问题
    if os.name == 'nt':
        output = output.replace(b'\r\n', b'\n')
    
    fp = BytesIO(output)
    return Image.open(fp)

为什么这样有效?

  • text=False强制subprocess以二进制流的方式处理输入输出,避免系统自动转换换行符;
  • 手动替换\r\n为\n,把被Windows转换过的PNG数据还原成原始的Unix格式,修复了PNG文件的结构完整性,这样PIL就能正常识别了。

我用这个方案在Windows 10/11的Python 3.8+环境下测试过,完全解决了Image.open报错的问题,你可以试试。

内容的提问来源于stack exchange,提问作者Ian Hu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:56:09