经过两天的研究,
思路:投屏到电脑,然后windows窗体截图。
具体思路是:可以使用投屏软件,把安卓屏幕投到电脑上,然后根据句柄,截取windows窗口截图
于是,我根据思路,,研究出来了使用python【当然如果精通其它语言,不会python,可以根据上面的思路自行写代码】,写出了可运行的python代码。
下面是具体方式
一、安装ADB,SCRCPY。
ADB的安装就不说了,还需要安卓手机开发者设置:里面打开USB调试开关。诸君自行搜索
SCRCPY是github上star最多的开源投屏
scrcpy使用:
解压缩
设置windows环境变量->系统变量->path->添加一个指向解压缩后的文件夹路径
打开cmd
命令提示符cmd中输入 【scrcpy -s 安卓手机序列号】
然后scrcpy就会弹出安卓投屏了
二、python代码
思路:使用os调用系统cmd打开安卓投屏,找到安卓投屏窗口句柄,根据句柄进行窗口截图
使用库:os库,win32gui库,PILLOW库
os库是python默认库,不需要安装
win32gui库,不能直接pip install win32gui【它不支持python3.9,最多仅支持3.6】
正确install代码:
pip install -i https://pypi.doubanio.com/simple/ pypiwin32
pillow库:网上很多教程,自行搜索
三、具体代码如下:
import time,os,datetime
from PIL import Image
import win32gui, win32ui, win32api, win32con
hwnd_title = dict()#获取windows窗口句柄+标题
def cut_pic_by_filename_XY(filename, x1, y1, x2, y2): # 根据图片路径,打开图片,并裁剪图片【从x1,y1到x2,y2】,然后保存裁剪出来的图片到硬盘
img = Image.open(filename) ## 打开filename文件,并赋值给img
imgSize = img.size # 大小/尺寸
w = img.width # 图片的宽
h = img.height # 图片的高
f = img.format # 图像格式
region = img.crop((x1, y1, x2, y2)) # 裁剪图片【从x1,y1到x2,y2】
current_date = datetime.datetime.now().strftime('%Y%m%d')#提取日期
save_path_dir = "./image/save_image/" + current_date
if not os.path.exists(save_path_dir):#文件夹不存在,则创建文件夹
os.makedirs(save_path_dir)
str_time = str(int(time.time()))#提取时间戳
pic_filename = filename.split("/")[-1]#提取路径中的文件名
region.save(save_path_dir + "/" + str_time + pic_filename) ## 将裁剪下来的图片保存到 时间戳+文件名.png
return save_path_dir + "/" + str_time + pic_filename#返回文件路径
def _get_all_hwnd(hwnd, mouse):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
def window_capture(filename, hwnd):#窗口截屏
#hwnd = 0 # 窗口的编号,0号表示当前活跃窗口
# 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
hwndDC = win32gui.GetWindowDC(hwnd)
# 根据窗口的DC获取mfcDC
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
# mfcDC创建可兼容的DC
saveDC = mfcDC.CreateCompatibleDC()
# 创建bigmap准备保存图片
saveBitMap = win32ui.CreateBitmap()
# 获取监控器信息
MoniterDev = win32api.EnumDisplayMonitors(None, None)
w = MoniterDev[0][2][2]
h = MoniterDev[0][2][3]
w2 = 600#设置截图的X轴宽度【可根据截图保存的文件filename查看,然后实际调整】
h2 = 1080#设置截图的Y轴高度【可根据截图保存的文件filename查看,然后实际调整】
# print w,h #图片大小
# 为bitmap开辟空间
saveBitMap.CreateCompatibleBitmap(mfcDC, w2, h2)
# 高度saveDC,将截图保存到saveBitmap中
saveDC.SelectObject(saveBitMap)
# 截取从左上角(0,0)长宽为(w,h)的图片
saveDC.BitBlt((0, 0), (w2, h2), mfcDC, (0, 0), win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC, filename)
#上面的截图尺寸不行,我就自己写了一个精确截图的def,其中x1,y1,x2,y2,诸君自行对比窗口截图
backpng = cut_pic_by_filename_XY(filename, 10, 45, 590, 1070)
return backpng
#可以运行以下注释的代码,获得手机的序列号,诸君可自行提取自己的手机序列号
#cmdstr = "adb devices"
#backstr = os.popen(cmdstr).read()
#print(backstr)
device_name = "b038bc0b"
device_n = ' -s ' + device_name
#scrcpy --crop设定屏幕=1080*1920并且偏移坐标为 (0,0)
#这里的--crop命令就是老版本的-c命令,新版本升级了,-c命令是错误的了。
#然而:网上面的所有有关scrcpy命令的教程文档,全部还是-c命令,真鸡儿扯淡,害我查半天
#-m 1024 限制画面分辨率=1024
#-b 4M修改视频码率=4M
# --window-x 100 --window-y 200 --window-width 405 --window-height 720设定窗体起始坐标,设置窗体宽和高
win_title = "MY_Test1"
#注意这里是windows窗体标题,最好每次打开的windows窗体标题不同,否则多个窗体标题一样的话
#会出现错误,找不到句柄
cmdstr = "scrcpy" + device_n + " --crop=1080:1920:0:0 --window-title "
cmdstr = cmdstr + win_title
cmdstr = cmdstr + " -m 1024 -b 4M"
os.popen(cmdstr)#打开scrcpy
time.sleep(3)#等待3秒,等待窗体彻底弹出
win32gui.EnumWindows(_get_all_hwnd, 0)#获取所有windows窗口句柄
hwnd = 0
for wnd in hwnd_title.items():#循环获取所有的windows句柄
print(wnd)#句柄值示例:(325674,"MI 5"):前面是windows句柄ID,后面是windows窗口标题
get_win_title = str(wnd[1])
if win_title == get_win_title:#根据windows窗口标题判断,是不是需要截图的窗口。
hwnd = wnd[0]
break
print("windows句柄ID:", hwnd)
cut_image_file = './image/scrcpy' + str(device_name) + '.png'
get_png = window_capture(cut_image_file, hwnd)#对windows窗体进行截图
print(get_png)
#关闭windows窗体
#win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
如上,可以截屏。
录屏的话:scrcpy有个录屏启动命令,直接使用该命令启动scrcpy,然后操作scrcpy弹出的投屏窗口,scrcpy会保存操作视频
scrcpy -s 手机序列号 --record file.mp4
代码没仔细研究,诸君可自行研究。思路:os用上述代码,操作cmd打开scrcpy,然后python控制鼠标scrcpy弹出的窗口,在该窗口上点击,滑动等等具体的操作,最后看file.mp4
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts
原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,