如何在Python中直接显示ADB截图(无需生成文件)
解决方案:直接显示ADB Screencap截图(无需生成文件)
首先,你遇到的TypeError: buf is not a numpy array, neither a scalar错误,核心原因是cv2.imdecode()需要接收numpy数组作为输入,但proc.stdout.read()返回的是原生字节(bytes)对象,直接传入就会触发类型错误。另外还要注意Windows环境下ADB的一个坑:screencap -p输出的图片数据会把换行符从\n转换成\r\n,这会导致图片格式损坏,必须先修正这个问题。
下面是修正后的完整代码,分步骤解释:
步骤1:导入必要模块
确保你已经安装了所需模块(你的环境里应该已经存在):
import subprocess import shlex import numpy as np import cv2
步骤2:获取并处理ADB截图字节数据
- 执行ADB命令获取截图的字节流
- 修复Windows下的换行符问题(把
\r\n换回\n) - 将bytes对象转换为numpy数组(
uint8类型,符合图像数据格式)
command = r"adb shell screencap -p" proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) # 读取完整的输出字节流(不带参数会读取全部内容,比固定上限更可靠) out = proc.stdout.read() # 修复Windows下的换行符问题:ADB会把\n转成\r\n,导致图片损坏 out = out.replace(b'\r\n', b'\n') # 将bytes转换为numpy数组,dtype设为uint8 img_array = np.frombuffer(out, dtype=np.uint8)
步骤3:解码并显示图片
现在可以用cv2.imdecode()处理numpy数组,然后显示:
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) if img is not None: cv2.imshow("ADB Screencap", img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("图片解码失败,请检查ADB连接或设备状态")
完整可运行代码
import subprocess import shlex import numpy as np import cv2 def show_adb_screencap(): command = r"adb shell screencap -p" proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) out = proc.stdout.read() # 修复Windows环境下的换行符问题 out = out.replace(b'\r\n', b'\n') img_array = np.frombuffer(out, dtype=np.uint8) img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) if img is not None: cv2.imshow("ADB Screencap", img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("无法解码截图,请确认:1. 设备已通过ADB连接;2. 设备已授权;3. ADB版本兼容") if __name__ == "__main__": show_adb_screencap()
额外注意事项
- 先用
adb devices命令验证设备是否已成功连接并授权 - 如果还是解码失败,可以尝试替换命令为
adb exec-out screencap -p,exec-out可以避免一些shell中转的问题:
command = r"adb exec-out screencap -p"
内容的提问来源于stack exchange,提问作者qwer11121
相关产品推荐
相关产品推荐

