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

如何将adb screencap输出的raw格式转为png并解决reshape报错

问题原因

报错核心原因是adb shell模式默认会将输出流中的\n替换为\r\n,篡改了screencap输出的原始raw二进制数据,导致数据长度和你预设的720*1280*4=3686400不匹配,无法完成reshape操作。

解决方案
  • 替换adb命令参数,使用exec-out替代shell,adb的exec-out模式会直接输出原始二进制数据,不会做换行符转换,从根源避免数据被篡改。
  • 优先读取screencap输出的前12字节头信息获取设备实际分辨率,避免硬编码分辨率不匹配的问题:前4字节为小端格式的屏幕宽度,接下来4字节为小端格式的屏幕高度,剩余字节为像素数据。
  • 格式转换完成后直接用opencv的imwrite方法导出png即可。
修正后完整代码
import subprocess
import cv2
import numpy as np

# 改用exec-out输出原始二进制
output = subprocess.check_output(f'src\\adb\\adb -s {serial} exec-out screencap')
# 读取头信息获取实际宽高
width = int.from_bytes(output[0:4], byteorder='little')
height = int.from_bytes(output[4:8], byteorder='little')
# 跳过12字节头,加载像素数据
array = np.frombuffer(output[12:], np.uint8).reshape(height, width, 4)
# BGRA转RGB(如果不需要额外处理直接存png的话,保留BGRA格式也可正常导出)
image = cv2.cvtColor(array, cv2.COLOR_BGRA2RGB)
# 导出为png
cv2.imwrite('screenshot.png', image)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:15:01