当前位置:  编程技术>移动开发

Android模拟器中窗口截图存成文件实现思路及代码

    来源: 互联网  发布时间:2014-10-13

    本文导语:  Android模拟器内容是用OpenGL渲染的,所以用一般的编程截图(如PrintWindow()等)会是黑屏。这是因为画的东西放在framebuffer里。 一种方法是通过adb把guest的framebuffer数据/dev/graphics/fb0倒到host,再转为图片。但这样速度比较慢。 好在...

Android模拟器内容是用OpenGL渲染的,所以用一般的编程截图(如PrintWindow()等)会是黑屏。这是因为画的东西放在framebuffer里。

一种方法是通过adb把guest的framebuffer数据/dev/graphics/fb0倒到host,再转为图片。但这样速度比较慢。

好在Android模拟器中把guest的framebuffer传到host进行显示,所以在host端只要将framebuffer输出到文件即可。

首先定义每次framebuffer更新时的回调函数:

代码如下:

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;
}

然后把这个回调函数注册上去,比如在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的更新时,guest的屏幕都会存成一张bmp图片,这和用/dev/graphics/fb0的效果是一样的。

注意用以上方法截下来的图和原图有两点不同,一是Blue和Red通道互换,这是因为framebuffer是RGB,bmp格式里是BGR。还有就是y轴的零点是左下角,这是由于framebuffer中是OpenGL的坐标系。也就是说,要得到原图还要经过RGB到BGR的转换和y-inversion。建议到处理图片时再做这些处理,一方面不会拖慢模拟器速度,另一方面像OpenCV里有现成的函数可供调用。

    
 
 

您可能感兴趣的文章:

  • android开发教程之用命令启动android模拟器并设置其内存大小
  • Intel HAXM为Android 模拟器加速解决模拟器运行慢的问题
  • Android 模拟器 Genymotion
  • Android启动模拟器报错解决方法
  • android模拟器能够上网,但无法ping通本地主机的ip和外网的ip
  • 在Android 模拟器上安装和卸载APK包的方法
  • 在Android模拟器上模拟GPS功能总是null的解决方法
  • 配置一个好用的Android模拟器让你不再对模拟器那么失望
  • 将文件放到Android模拟器的SD卡中的两种解决方法
  • Android 模拟器(JAVA)与C++ socket 通讯 分享
  • Android模拟器对应的电脑快捷键说明
  • WAC启动Android模拟器 transfer error: Read-only file system错误解决方法
  • android模拟器开发和测试nfc应用实例详解
  • 二个android模拟器互发短信程序演示
  • Android中通过view方式获取当前Activity的屏幕截图实现方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • android获取屏幕像素思路及代码
  • Android 再按一次返回键退出程序实现思路
  • Android TableLayout数据列表的回显清空实现思路及代码
  • android获取照片的快照 思路及实现方法
  • Android中设置只有程序第一次运行才显示的界面实现思路
  • android dialog边框去除白色边框实现思路及代码
  • android 类似微信的摇一摇功能实现思路及代码
  • android实现横屏的代码及思路
  • Android自定义格式显示Button的布局思路
  • android获取音乐文件的内置专辑图片实现思路及代码
  • Android 使用Intent传递数据的实现思路与代码
  • Android生存指南之:解Bug策略与思路问题的详解
  • Android中获取网页表单中的数据实现思路及代码
  • Android Metro菜单实现思路及代码
  • android 仿微信聊天气泡效果实现思路
  • Android自定义Adapter的ListView的思路及代码
  • Android实现歌曲播放时歌词同步显示具体思路
  • Android列表实现(3)_自定义列表适配器思路及实现代码
  • android 自定义ScrollView实现背景图片伸缩的实现代码及思路
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍
  • Android 开发环境 Android Studio


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3