import subprocess # 执行adb命令,获取屏幕截图 result = subprocess.check_output(["adb", "shell", "screencap", "-p"], shell=True) # 将二进制数据保存为PNG文件 with open("screenshot.png", "wb") as file: file.write(result)没有图片输出怎么定位
时间: 2023-09-17 09:14:46 浏览: 251
如果没有生成截屏图片,可以尝试检查以下几个方面:
1. 检查是否已经正确连接到了 Android 设备。可以使用`adb devices`命令检查设备是否已经连接成功。
2. 检查当前系统环境变量,确保 adb 命令已经被加入到了系统路径中。可以尝试在命令行中执行 `adb shell screencap -p` 命令,如果能够成功截屏并输出二进制数据,则说明 adb 命令已经正常工作。
3. 检查是否已经开启了 USB 调试模式。在 Android 设备上打开设置,进入开发者选项,然后开启 USB 调试模式。
4. 检查脚本是否在正确的路径下执行,以及是否有写入权限。可以使用 `os.getcwd()` 命令获取当前脚本的路径,并检查是否拥有写入截屏图片的权限。
如果还是无法定位问题,可以尝试调试脚本,例如在执行命令的时候增加一些输出语句,查看命令的输出以及错误信息,以便更好地定位问题所在。
相关问题
output = subprocess.check_output('adb exec-out screencap -p', shell=True)不返回数据
这是一个使用 Python 的 subprocess 模块调用 adb 命令截取屏幕截图的代码片段。可能因为以下原因导致 `subprocess.check_output()` 函数没有返回数据:
1. 当前设备未连接到计算机或者 adb 未能识别设备;
2. adb 命令执行出错,例如没有获取到屏幕截图;
3. 子进程被阻塞或已经崩溃。
为了找出具体原因,您可以在代码中添加异常处理语句,例如:
```python
import subprocess
try:
output = subprocess.check_output('adb exec-out screencap -p', shell=True)
# 处理 output 中的数据
except subprocess.CalledProcessError as e:
print('Error:', e)
except Exception as e:
print('Unexpected error:', e)
```
这样可以捕获到 `check_output()` 函数抛出的异常,并输出错误信息。您可以根据错误信息来排查问题。
import subprocess import cv2 import numpy as np import time import calendar #从手机获取二进制图片 def get_app_img(): # 从ADB获取屏幕图像 try: output = subprocess.check_output('adb exec-out screencap -p', shell=True) # 处理 output 中的数据 except subprocess.CalledProcessError as e: print('Error:', e) except Exception as e: print('Unexpected error:', e) return output #获取每一张图片的三维数据 def get_imgdecdoe(): output = get_app_img() # print("------output-----{}".format(output)) # 将输出转换为图像 image1 = cv2.imdecode(np.fromstring(output, dtype='uint8'), cv2.IMREAD_COLOR) # print(image) # #缩小图片的大小 image = cv2.resize(image1, (int(1080 / 3), int(2340 / 3))) return image def app_video(): save_path=r"E:\myTool\appium_xiangmu\test_video" ts=calendar.timegm(time.gmtime()) videoname = str(ts)+ ".mp4" save_file_path = '{}\\{}'.format(save_path, videoname) #保存视频 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式) video = cv2.VideoWriter(save_file_path, fourcc, 5, (int(1080/3),int(2340/3))) try: while True: image = get_imgdecdoe() # 显示图像 cv2.imshow('Screen', image) # 按下ESC键退出循环 if cv2.waitKey(1) == 27: break image=get_imgdecdoe() video.write(image) finally: video.release() #释放 print("________视频处理完毕_______:视频号显示:{}".format(videoname)) cv2.destroyAllWindows() if __name__ == '__main__': app_video(),缺少录制时用户的点击的提示怎么处理,有实例代码吗
如果想要在录制的视频中添加用户的点击提示,可以使用cv2.circle()函数在视频中绘制一个圆圈来表示用户的点击。具体实现可以在获取到每一张图片的时候,判断手机屏幕是否有点击事件发生,如果有,则在该图片上绘制一个圆圈。以下是一个示例代码:
```
import subprocess
import cv2
import numpy as np
import time
import calendar
# 从手机获取二进制图片
def get_app_img():
# 从ADB获取屏幕图像
try:
output = subprocess.check_output('adb exec-out screencap -p', shell=True)
# 处理 output 中的数据
except subprocess.CalledProcessError as e:
print('Error:', e)
except Exception as e:
print('Unexpected error:', e)
return output
# 获取每一张图片的三维数据
def get_imgdecdoe():
output = get_app_img()
# 将输出转换为图像
image1 = cv2.imdecode(np.fromstring(output, dtype='uint8'), cv2.IMREAD_COLOR)
# 缩小图片的大小
image = cv2.resize(image1, (int(1080 / 3), int(2340 / 3)))
return image
# 在图片上绘制圆圈
def draw_circle(image, x, y):
# 设置圆圈的颜色和半径
color = (0, 0, 255)
radius = 10
# 在图片上绘制圆圈
cv2.circle(image, (x, y), radius, color, -1)
def app_video():
save_path=r"E:\myTool\appium_xiangmu\test_video"
ts=calendar.timegm(time.gmtime())
videoname = str(ts)+ ".mp4"
save_file_path = '{}\\{}'.format(save_path, videoname)
#保存视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
video = cv2.VideoWriter(save_file_path, fourcc, 5, (int(1080/3),int(2340/3)))
try:
while True:
# 获取当前的屏幕图像
image = get_imgdecdoe()
# 判断是否有点击事件发生
# 这里假设点击事件的坐标为 (x, y)
if 点击事件发生:
# 在图片上绘制圆圈
draw_circle(image, x, y)
# 显示图像
cv2.imshow('Screen', image)
# 按下ESC键退出循环
if cv2.waitKey(1) == 27:
break
# 将图片写入视频文件
video.write(image)
finally:
# 释放视频文件
video.release()
print("________视频处理完毕_______:视频号显示:{}".format(videoname))
cv2.destroyAllWindows()
if __name__ == '__main__':
app_video()
```
在上面的代码中,我们定义了一个 `draw_circle()` 函数,用于在图片上绘制圆圈。然后在每次获取到屏幕图像时,判断是否有点击事件发生,如果有,则在该图片上绘制一个圆圈。最后将图片写入视频文件即可。
阅读全文