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
相关产品推荐
相关产品推荐

