python 几种android截屏方式的学习与使用

screencap

screencap是Android的截屏工具。通过调用访问SurfaceFlinger服务或读取 /dev/graphics/fb0文件来实现屏幕截取。

方法:

  1. 直接获得图片的二进制数据,然后解析成相应的图片
 import subprocessimport cv2import numpy as npdef get_screenshot():# 使用subprocess的Popen调用adb shell命令,并将结果保存到PIPE管道中process = subprocess.Popen('adb shell screencap -p', shell=True, stdout=subprocess.PIPE)# 读取管道中的数据screenshot = process.stdout.read()# 将读取的字节流数据的回车换行替换成'\n'binary_screenshot = screenshot.replace(b'\r\n', b'\n')# 使用numpy和imdecode将二进制数据转换成cv2的mat图片格式img_screenshot = cv2.imdecode(np.frombuffer(binary_screenshot, np.uint8), cv2.IMREAD_COLOR)return img_screenshot
  1. 将截图保存成png图片,然后pull到电脑端再读取
 import subprocessimport cv2def adb(order):return subprocess.Popen(order, shell=True, stdout=subprocess.PIPE, encoding='UTF-8').stdoutdef get_screenshot():adb('adb shell /system/bin/screencap -p /sdcard/screenshot.png') # 将截图保存到SDCardadb('adb pull /sdcard/screenshot.png ./screenshot.png')# 将截图从手机拉取到电脑adb('adb shell rm /sdcard/screenshot.png')# 删除手机端的截图image = cv2.imread('./screenshot.png') # 使用imread读取截图return image

appium

appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。
appium的安装就不在这里介绍了
关于appium安装配置时遇到的问题(传送门)

方法:

#-*- coding: UTF-8 -*-
import os
import time
import unittest
import base64
import numpy as np
import cv2
from appium import webdriver
# 用于路径的转换
PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)
)desired_caps={}
desired_caps['platformName']='Android'
desired_caps['version']='6.0.0'
desired_caps['deviceName']='MI MAX 2'#这是测试机的型号,可以查看手机的关于本机选项获得# desired_caps['app'] = PATH('mobileqq.apk')#被测试的App在电脑上的位置
# print(desired_caps['app'])
desired_caps['appPackage'] = 'com.tencent.mobileqq'
desired_caps['appActivity'] = 'com.tencent.mobileqq.activity.SplashActivity'
driver=webdriver.Remote('http://127.0.0.1:4725/wd/hub',desired_caps) # 访问端口,用于获取数据
time.sleep(3)# 方法一:
# 使用appium的get_screenshot_as_flie(image_save_path),直接将图片数据保存早电脑端
# 然后通过cv2读取
while True:driver.get_screenshot_as_file(screen_save_path)start = time.clock()img = cv2.imread('./screenshot.png')cv2.imshow('test', img)cv2.waitKey(1)# 方法二:
# 使用appium的get_screenshot_as_base64()获得截屏的数据流
# 然后通过base64解析数据格式
# 使用numpy再次转换成uint8格式
# 最后使用cv2自带的imdecode转换成mat格式
while(True):base64data = driver.get_screenshot_as_base64()imgData = base64.b64decode(base64data)nparr = np.fromstring(imgData,np.uint8)img = cv2.imdecode(nparr, 1)cv2.imshow('test', img)cv2.waitKey(1)

minicap

minicap是开源项目STF(Smartphone Test Farm)中的一个工具,负责屏幕显示。
minicap的配置也不介绍了,网上有很多

方法:

网上提供了很多种连续获取图片的方式,但是很多时候,在获取一张图片之后就马上需要对其进行处理,这样的情况连续获取图片的方式并不合适
但是由于minicap本身传输的设定,手机端的minicap会源源不断的想socket传输图片信息,导致再次通过socket获得图片时,并不一定是当前的图片信息
这个时候采用的是重新断开socket连接的方式来再次获得图片

# 连接端口
import socket
import cv2
import numpy as np  def get_image()client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('localhost', 7777))readBannerBytes = 0bannerLength = 24readFrameBytes = 0frameBodyLengthRemaining = 0frameBody = ''while True:chunk = self.client_socket.recv(12000)if len(chunk) == 0:continuecursor = 0while cursor < len(chunk):# 跳过前面24位baner信息 if (readBannerBytes < bannerLength):cursor += 1readBannerBytes += 1elif readFrameBytes < 4: # 在一开始的24位baner信息之后就是4位图片长度的信息frameBodyLengthRemaining += (int(hex(chunk[cursor]), 16) << (readFrameBytes * 8))cursor += 1readFrameBytes += 1else:# 如果当前剩下的数据长度超过了图片还未读取的长度,说明这里包含了下一张图片的信息(由于不是连续读取,所以不考虑这些信息)if len(chunk) - cursor >= frameBodyLengthRemaining:frameBody = frameBody + chunk[cursor:(cursor + frameBodyLengthRemaining)]if hex(frameBody[0]) != '0xff' or hex(frameBody[1]) != '0xd8':exit()img = np.array(bytearray(frameBody))img = cv2.imdecode(img, 1)self.client_socket.close()return imgelse:# 这次数据的读取还未达到图片的数据的长度 frameBody = bytes(list(frameBody) + list(chunk[cursor:len(chunk)]))frameBodyLengthRemaining -= (len(chunk) - cursor)readFrameBytes += len(chunk) - cursorcursor = len(chunk)if __name__ == '__main__':image = get_image()

python 几种android截屏方式的学习与使用相关推荐

  1. 华为Android10版怎么截屏,华为Mate 10怎么截屏 三种智能截屏方式图文教程

    相信所有用户在使用手机的过程中都会使用到截屏功能,那么在华为新款旗舰Mate10 上如何截屏,共有哪些截屏方式呢?下面就让小编给大家带来最详细的Mate10 智能截屏教程. 相信,华为的老用户们应该都 ...

  2. 华为手机截屏怎么截长图_华为手机5种常用截屏方式,教你轻松定格屏幕精彩瞬间...

    手机上的精彩内容这么多,想要截图发好友,你知道怎么截才最顺手嘛? 华为手机提供了多种实用又快捷的截屏方法,总有一种适合你,快来看看吧~ 隔空截屏 抓取截屏,酷炫手势 在屏幕正前方20~40厘米,伸开手 ...

  3. android关于截屏,关于android截屏知识的学习

    最近要做手机截取当前屏幕的开发,发了大半天时间在网上找了很多资料,终于有了一个大概的头绪和思路,若有问题望指点,谢谢! 目前而言个人了解android有三种截屏方法: 1.android SDK提供的 ...

  4. 小米android截屏快捷键是什么原因,你知道么,小米手机的截屏方式居然有5种!...

    原标题:你知道么,小米手机的截屏方式居然有5种! 都知道小米手机受欢迎的其中一个重要因素是小米的MIUI系统,MIUI系统可以说是最符合国人操作.最人性化的基于Android系统深度优化.定制.开发的 ...

  5. android 手机如何截图,原来安卓手机有这么多种截屏方式 最后两种一般人不会用...

    原标题:原来安卓手机有这么多种截屏方式 最后两种一般人不会用 在这个信息化的时代,智能手机几乎主宰着天下,人人手中一部智能机 .看新闻,听歌曲,打游戏.我们的日常几乎全部由手机霸占着.但截屏作为初级的 ...

  6. android 截屏 效率,手机知识大科普!效率神器!华为手机这几种截屏方式你知道吗?...

    手机知识大科普!效率神器!华为手机这几种截屏方式你知道吗? 2020-03-06 19:44:35 0点赞 3收藏 0评论 如今手机已经成为了我们最为亲密的伙伴,不仅应付我们的日常生活,就连很多办公也 ...

  7. Android截屏的几种实现

    Android截屏的几种实现 最近我们的APP要求需要截屏功能,网上看了看大致有一下几种实现的方式,由于我们的机器是特定的设备,(类似于广告机,已经ROOT),所以就采用最简单的方式,只需在代码中执行 ...

  8. Android实现截屏方式

    本文介绍了Android 实现截屏方式整理,分享给大家.希望对大家有帮助 可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选取一部分 自动截取某个空间或者布局 截取长图 ...

  9. 计算机图片怎么截图快捷键,电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?...

    电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图? 网际百科资讯    知识宝库    2020-3-18    43955    0评论 电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?给你推 ...

最新文章

  1. 手机桌面隐藏大师_受够了内置主题?扒一扒Windows 10隐藏主题
  2. Linux系统中的防火墙的实现:iptables/netfilter
  3. mysql中将某个字段做计算,mysql创建计算字段使用子查询教程
  4. Android Intent 用法总结
  5. 最大似然估计_机器学习最大似然估计
  6. 性能测试--jmeter中正则表达式提取器的使用【16】
  7. java 8 接口默认方法
  8. linux内核声卡管理,linux下声卡驱动简介
  9. python 写命令行_一个用python写的用命令行看糗百的小工具
  10. mysql table already_MySQL优化表时提示 Table is already up to date的解决方法
  11. 逆透视变换(IPM)多种方式及代码总结
  12. 机器学习知识点全面总结
  13. python如何从键盘输入数据_python如何从键盘输入数据?
  14. 《炬丰科技-半导体工艺》 高频磷化铟芯片晶圆级背面加工
  15. 《北京住房公积金提取管理办法 》
  16. Karl Guttag:AR眼镜应根据用途来设计,VST并未解决技术难题
  17. Infor SyteLine ERP 客户端使用设置
  18. calendar java 线程安全_Calendar(线程不安全)
  19. 80端口被占用的解决办法
  20. CSS标准盒模型和怪异盒模型区别

热门文章

  1. 论文学习:Decoupling Value and Policy for Generalization in Reinforcement Learning(强化学习中泛化的解耦价值和策略)
  2. 图组:奥运火炬样式揭晓 灵感来自“祥云”
  3. JSON-handle插件使用-Chrome浏览器
  4. php支付宝手机网站支付功能,手机网站支付如何接入支付宝简易版支付功能PHP版...
  5. 【DL】第15章 使用RNN 和 CNN处理序列
  6. 外星人入侵游戏python学习_外星人入侵:使用Python开发游戏
  7. php jssdk 类,jsSdk.class.php
  8. Python3.6.1 AES/ECB/padding PKCS5 方法的加密解密脚本实现
  9. javascript,一幅图让你看懂DIV拖拽
  10. java.security.cert.CertificateException: No name matching IP found