Android模擬器中窗口截圖存成文件實(shí)現(xiàn)思路及代碼
Android模擬器內(nèi)容是用OpenGL渲染的,所以用一般的編程截圖(如PrintWindow()等)會(huì)是黑屏。這是因?yàn)楫嫷臇|西放在framebuffer里。
一種方法是通過adb把guest的framebuffer數(shù)據(jù)/dev/graphics/fb0倒到host,再轉(zhuǎn)為圖片。但這樣速度比較慢。
好在Android模擬器中把guest的framebuffer傳到host進(jìn)行顯示,所以在host端只要將framebuffer輸出到文件即可。
首先定義每次framebuffer更新時(shí)的回調(diào)函數(shù):
void zjin_fb_update(void* context,
int w, int h, int ydir,
int format, int type,
unsigned char* pixels)
{
#define CHANNEL 4
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
int width = w;
int height = h;
FILE *file = fopen("capture.bmp", "wb");
if( file!=NULL )
{
memset( &bf, 0, sizeof( bf ) );
memset( &bi, 0, sizeof( bi ) );
bf.bfType = 'MB';//BM?
bf.bfSize = sizeof(bf)+sizeof(bi)+width*height*CHANNEL;
bf.bfOffBits = sizeof(bf)+sizeof(bi);
bi.biSize = sizeof(bi);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 8 * CHANNEL;
bi.biSizeImage = width*height*CHANNEL;
fwrite( &bf, sizeof(bf), 1, file );
fwrite( &bi, sizeof(bi), 1, file );
fwrite( pixels, sizeof(unsigned char), height*width*CHANNEL, file );
fclose( file );
}
return;
}
然后把這個(gè)回調(diào)函數(shù)注冊(cè)上去,比如在OpenGL窗口顯示之后:
android_showOpenglesWindow(winhandle, drect.pos.x, drect.pos.y,
drect.size.w, drect.size.h, disp->rotation * -90.);
android_setPostCallback(zjin_fb_update, NULL);
這樣,每次有framebuffer的更新時(shí),guest的屏幕都會(huì)存成一張bmp圖片,這和用/dev/graphics/fb0的效果是一樣的。
注意用以上方法截下來(lái)的圖和原圖有兩點(diǎn)不同,一是Blue和Red通道互換,這是因?yàn)閒ramebuffer是RGB,bmp格式里是BGR。還有就是y軸的零點(diǎn)是左下角,這是由于framebuffer中是OpenGL的坐標(biāo)系。也就是說,要得到原圖還要經(jīng)過RGB到BGR的轉(zhuǎn)換和y-inversion。建議到處理圖片時(shí)再做這些處理,一方面不會(huì)拖慢模擬器速度,另一方面像OpenCV里有現(xiàn)成的函數(shù)可供調(diào)用。
- Native.js獲取監(jiān)聽開關(guān)等操作Android藍(lán)牙設(shè)備實(shí)例代碼
- native.js獲取手機(jī)硬件基本信息實(shí)例代碼android版
- Dcloud的native.js直接撥打電話Android實(shí)例代碼
- DCloud的native.js調(diào)用系統(tǒng)分享實(shí)例Android版代碼
- Android中通過view方式獲取當(dāng)前Activity的屏幕截圖實(shí)現(xiàn)方法
- Android中如何獲取視頻文件的截圖、縮略圖
- 詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)
- Android實(shí)現(xiàn)截圖和分享功能的代碼
- Android獲取常用輔助方法(獲取屏幕高度、寬度、密度、通知欄高度、截圖)
- Android實(shí)現(xiàn)拍照截圖功能
- android截圖事件監(jiān)聽的原理與實(shí)現(xiàn)
- Android屏幕及view的截圖實(shí)例詳解
- Android截屏截圖的幾種方法總結(jié)
- Android實(shí)現(xiàn)截圖分享qq 微信功能
- Android實(shí)現(xiàn)從相冊(cè)截圖的功能
- Android 中WebView 截圖的實(shí)現(xiàn)方式
- Android App內(nèi)監(jiān)聽截圖加二維碼功能代碼
- Android 5.0及以上編程實(shí)現(xiàn)屏幕截圖功能的方法
- Android仿銀行客戶簽名并且保存簽名的截圖文件并命名為本地時(shí)間
- Android 截圖功能源碼的分析
- Android使用WebView實(shí)現(xiàn)截圖分享功能
- Native.js屏幕截圖實(shí)例代碼
相關(guān)文章
詳解android 中animation-list 動(dòng)畫的應(yīng)用
本篇文章主要介紹了詳解android 中animation-list 動(dòng)畫的應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-12-12android實(shí)現(xiàn)倒計(jì)時(shí)功能代碼
實(shí)現(xiàn)倒計(jì)時(shí)每隔1秒,變換一下時(shí)間,截圖如下,感興趣的朋友想看下實(shí)現(xiàn)代碼,希望對(duì)你學(xué)習(xí)有所幫助2013-06-06Android Studio升級(jí)3.6 Build窗口出現(xiàn)中文亂碼問題解決方法
這篇文章主要介紹了Android Studio升級(jí)3.6 Build窗口出現(xiàn)中文亂碼問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android靜默安裝實(shí)現(xiàn)方案 仿360手機(jī)助手秒裝和智能安裝功能
這篇文章主要介紹了Android靜默安裝實(shí)現(xiàn)方案,仿360手機(jī)助手秒裝和智能安裝功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android pdf viewer在android studio應(yīng)用問題說明詳解
這篇文章主要介紹了Android pdf viewer在android studio應(yīng)用問題說明的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Android 基于百度語(yǔ)音的語(yǔ)音交互功能(推薦)
最近在開發(fā)android的項(xiàng)目,在項(xiàng)目需求中要用到語(yǔ)音喚醒功能。之前都沒接觸過,今天小編就給大家分享android基于百度語(yǔ)音的語(yǔ)音交互功能,非常不錯(cuò),感興趣的朋友一起看看吧2016-11-11android 幀動(dòng)畫,補(bǔ)間動(dòng)畫,屬性動(dòng)畫的簡(jiǎn)單總結(jié)
本文主要對(duì)android 幀動(dòng)畫,補(bǔ)間動(dòng)畫,屬性動(dòng)畫進(jìn)行了簡(jiǎn)單總結(jié),具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01