日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

从FrameBuffer中获取Android屏幕截图

發布時間:2025/5/22 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从FrameBuffer中获取Android屏幕截图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道,DDMS可以很容易的獲取Android 手機 的屏幕截圖,那么它是怎么做到的呢?

其實,android手機上有一個叫做FrameBuffer的設備,圖像信息都是通過FrameBuffer寫到手機屏幕上去的。因此可以通過讀取此設備中的數據來獲取當前正在顯示的圖像。當然DDMS也是這么做到的。

FrameBuffer 對應的設備文件就是/dev/graphics/fb0。因此我們可以通過下面的代碼讀取屏幕圖像數據。其中傳入的參數fd為一個文件描述符,也可以是 socket描述符。這樣我們就可以把從fb中讀取的屏幕圖像信息傳遞給我們自己的應用,從而獲取手機屏幕信息。

void framebuffer_service(int fd)
{
struct fb_var_screeninfo vinfo;
int fb, offset;
char x[256];

struct fbinfo fbinfo;
unsigned i, bytespp;

fb = open("/dev/graphics/fb0", O_RDONLY);
if(fb < 0) goto done;

if(ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) goto done;
fcntl(fb, F_SETFD, FD_CLOEXEC);

bytespp = vinfo.bits_per_pixel / 8;

fbinfo.version = DDMS_RAWIMAGE_VERSION;
fbinfo.bpp = vinfo.bits_per_pixel;
fbinfo.size = vinfo.xres * vinfo.yres * bytespp;
fbinfo.width = vinfo.xres;
fbinfo.height = vinfo.yres;
fbinfo.red_offset = vinfo.red.offset;
fbinfo.red_length = vinfo.red.length;
fbinfo.green_offset = vinfo.green.offset;
fbinfo.green_length = vinfo.green.length;
fbinfo.blue_offset = vinfo.blue.offset;
fbinfo.blue_length = vinfo.blue.length;
fbinfo.alpha_offset = vinfo.transp.offset;
fbinfo.alpha_length = vinfo.transp.length;

/* HACK: for several of our 3d cores a specific alignment
* is required so the start of the fb may not be an integer number of lines
* from the base. As a result we are storing the additional offset in
* xoffset. This is not the correct usage for xoffset, it should be added
* to each line, not just once at the beginning
*/
offset = vinfo.xoffset * bytespp;

offset += vinfo.xres * vinfo.yoffset * bytespp;
printf("offset %d/n", offset);

if(writex(fd, &fbinfo, sizeof(fbinfo))) goto done;

lseek(fb, offset, SEEK_SET);
for(i = 0; i < fbinfo.size; i += 256) {
if(readx(fb, &x, 256)) goto done;
if(writex(fd, &x, 256)) goto done;
}

if(readx(fb, &x, fbinfo.size % 256)) goto done;
if(writex(fd, &x, fbinfo.size % 256)) goto done;

done:
if(fb >= 0) close(fb);
close(fd);
}


編輯器加載中...

轉載于:https://www.cnblogs.com/greensoft-taobao/archive/2011/11/09/2243356.html

總結

以上是生活随笔為你收集整理的从FrameBuffer中获取Android屏幕截图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。