成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[Archer's Python Lab]jython+ddmlib 安卓屏幕截圖并在we

Hujiawei / 1606人閱讀

摘要:代碼獲取設(shè)備列表信息獲取設(shè)備列表信息超時(shí)獲取所有已連接設(shè)備根據(jù)獲取單個(gè)當(dāng)前設(shè)備不存在序號(hào)為的設(shè)備請(qǐng)檢查連接獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)保存圖像字節(jié)數(shù)據(jù)保存當(dāng)前屏幕對(duì)象將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片橫屏尺寸處理發(fā)生異常為空

  

部分代碼思路來(lái)源于互聯(lián)網(wǎng)

需求

之前一直在尋找一種完美的移動(dòng)設(shè)備屏幕流回傳方案,這種嘗試一旦成功即可運(yùn)用于多種平臺(tái),比如云端測(cè)試Portal中對(duì)機(jī)器設(shè)備屏幕的實(shí)時(shí)監(jiān)控,再輔以html5強(qiáng)大的特性,可以直接在web上模擬手機(jī)操作,達(dá)到"遠(yuǎn)程監(jiān)控"的目的,本demo的部分思路來(lái)源于互聯(lián)網(wǎng),我嘗試用jython全部重寫了一遍,這種方式實(shí)現(xiàn)起來(lái)雖然比較"土鱉",但是效果基本可以符合需求,下面是效果圖和代碼清單。

代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Android_ScreenSream by Archer
# Based on Jython,ddmlib

#import jar
import sys,os
sys.path.append(r"C:ddmlib.jar")
sys.path.append(r"C:guava17.jar")
sys.path.append(r"C:
t.jar")
from threading import Thread

#import lib
from java.awt.image import *
from java.io import *
from javax.imageio import *
from com.android.ddmlib import *
from time import sleep

class AndroidScreenStream(object):

    def __init__(self):
        super(AndroidScreenStream,self).__init__()
        self.devices=[]
        self.currentdevice=None
        self.rawimgdata=None
        self.rawscreen=None

    def wait_device_lists(self,bridge):
        """獲取設(shè)備列表信息"""
        count=0
        while(bridge.hasInitialDeviceList()==False):
            try:
                sleep(0.5)
                count+=1
            except:
                pass
            if(count>60):
                print "獲取設(shè)備列表信息超時(shí)!"
                break

    def get_devices(self):
        """獲取所有已連接設(shè)備"""
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        self.devices.append(mybridge.getDevices())
        return self

    def get_device_by_index(self,index):
        """根據(jù)index獲取單個(gè)當(dāng)前設(shè)備"""
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        try:
            self.currentdevice=mybridge.getDevices()[index]
            return self
        except IndexError:
            print "不存在序號(hào)為"+str(index)+"的設(shè)備,請(qǐng)檢查USB連接!"
            sys.exit()

    def get_current_screen_imgbyes(self):
        """獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)"""
        self.rawimgdata=self.currentdevice.getScreenshot().data #保存圖像字節(jié)數(shù)據(jù)
        return self

    def get_current_rawscreen(self):
        """保存當(dāng)前屏幕screen對(duì)象"""
        self.rawscreen=self.currentdevice.getScreenshot()
        return self

    def save_screen_img(self,path=os.path.join(os.getcwd(),"current_frame.jpeg"),islandscape=False):
        """將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片"""
        if self.rawscreen is not None:
            landscape=islandscape
            #橫屏尺寸處理
            imgwidth=self.rawscreen.height if landscape else self.rawscreen.width
            imgheight=self.rawscreen.width if landscape else self.rawscreen.height
            image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            if image.getHeight()!=imgheight or image.getWidth()!=imgwidth:
                image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            index=0
            indexInc=self.rawscreen.bpp>>3
            for y in range(self.rawscreen.height):
                for x in range(self.rawscreen.width):
                    value=self.rawscreen.getARGB(index)
                    if landscape:
                        image.setRGB(y,self.rawscreen.width-x-1,value)
                    else:
                        image.setRGB(x,y,value)
                    index+=indexInc
            try:
                ImageIO.write(image,"JPEG",File(path))
            except IOError:
                print "發(fā)生異常!"
                sys.exit()
        else:
            print "rawscreen為空!"
            sys.exit()

if __name__=="__main__":
    ASS=AndroidScreenStream()
    ShotDevice=ASS.get_device_by_index(0)
    while True:
        ShotDevice.get_current_rawscreen().save_screen_img()
Github

Android_Screen_Stream

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37413.html

相關(guān)文章

  • Archer's Un*x Lab]Brew Python 與 Xcode Plugin

    摘要:通過(guò)安裝的會(huì)提示移除自帶的版本,除非你忽略這個(gè),但同時(shí)又會(huì)帶來(lái)一系列的安裝問(wèn)題,由于的某些默認(rèn)會(huì)加載,故經(jīng)常導(dǎo)致的不能啟動(dòng)問(wèn)題可以嘗試用一句話解決。查看出錯(cuò)信息首先通過(guò)安裝接著直接,這個(gè)時(shí)候就可以成功了,順利啟動(dòng)。 通過(guò)brew安裝的python會(huì)提示移除mac os自帶的python版本,除非你忽略這個(gè)warning,但同時(shí)又會(huì)帶來(lái)一系列package的安裝問(wèn)題,由于xcode...

    Shonim 評(píng)論0 收藏0
  • Java之調(diào)用Python代碼

    摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。 ??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開(kāi)發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎???想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法: 直接通過(guò)Runt...

    gghyoo 評(píng)論0 收藏0
  • Java之調(diào)用Python代碼

    摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。 ??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開(kāi)發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎???想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法: 直接通過(guò)Runt...

    saucxs 評(píng)論0 收藏0
  • python 代碼 打包成jar

    摘要:寫東西快但是生態(tài)廣比如大數(shù)據(jù)雖然好但是利用不到的整個(gè)的生態(tài)的代碼雖然也好但是畢竟有些庫(kù)需要自己寫的多雖然也很簡(jiǎn)單但是查文檔也很麻煩那么問(wèn)題來(lái)了最簡(jiǎn)單的的方式就是直接把打包那么問(wèn)題又來(lái)了打包成挺麻煩的官方文檔看不懂答案有了寫了個(gè)包搞這個(gè)事情 py 寫東西快 但是java 生態(tài)廣 比如大數(shù)據(jù) py 雖然好 但是利用不到j(luò)ava的整個(gè)的生態(tài)的代碼 scala 雖然也好但是畢竟 有些庫(kù) ...

    sugarmo 評(píng)論0 收藏0
  • python 代碼 打包成jar

    摘要:寫東西快但是生態(tài)廣比如大數(shù)據(jù)雖然好但是利用不到的整個(gè)的生態(tài)的代碼雖然也好但是畢竟有些庫(kù)需要自己寫的多雖然也很簡(jiǎn)單但是查文檔也很麻煩那么問(wèn)題來(lái)了最簡(jiǎn)單的的方式就是直接把打包那么問(wèn)題又來(lái)了打包成挺麻煩的官方文檔看不懂答案有了寫了個(gè)包搞這個(gè)事情 py 寫東西快 但是java 生態(tài)廣 比如大數(shù)據(jù) py 雖然好 但是利用不到j(luò)ava的整個(gè)的生態(tài)的代碼 scala 雖然也好但是畢竟 有些庫(kù) ...

    freecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<