android native

编程入门 行业动态 更新时间:2024-10-24 14:26:04

<a href=https://www.elefans.com/category/jswz/34/1771384.html style=android native"/>

android native

android native_window的显示问题

  • 1.前言
  • 2.问题的出现
  • 3.解决过程

1.前言

在将android surface转换为native_window后,显示图片不正常。

2.问题的出现

在android运行如下代码后,显示并不是全红色,后面有一部分未显示红色,在显示图片时也是一样的现象,某些分辨率的图片可以正常显示,某些不正常:

    ANativeWindow_Buffer wbuf;ANativeWindow *native_window = ANativeWindow_fromSurface(env, surface);int32_t re = ANativeWindow_setBuffersGeometry(native_window, 100, 100, WINDOW_FORMAT_RGBA_8888);int curr_format = ANativeWindow_getFormat(native_window);ANativeWindow_lock(native_window, &wbuf, 0);uint32_t color = 0x00ff0000; //红色 RGBAuint32_t *screen = (uint32_t *) wbuf.bits;for (int i = 0; i < 100; i++) {for(int j = 0; j < 100; j++) {screen[i*100 + j] = color;}ANativeWindow_unlockAndPost(native_window);

3.解决过程

查看ijkplayer中的native_window显示部分,发现用到了wbuf中的stride成员,于是查了一下stride的含义,上面的代码默认native_window的buffer就是100x100(4byte)的大小,如果实际是这样就没有错,但是实际上buffer的大小不是100x100,而是100x128,可能是因为内存对齐之类的原因,实际的buffer宽总是16或32的倍数,这样可以提高计算效率,实际的buffer宽度保存在wbuf.stride中,如下图所示,ANativeWindow_Buffer中的成员含义如下:

上图中,绿色部分是显示出来的部分,蓝色部分是由于内存对齐多出来的部分,绿色和蓝色加起来就是总的buffer大小,可以看到总buffer等于stride * height * format(4 or 3 or other),而并不是上面的代码中的width * height * format(4 or 3 or other),假如我们要显示一张100x100的RGBA图片,则我们要将100x100的图片中的RGBA的数据复制到绿色部分,这样才能正常显示,而wbuf中的bits是从左到右(包含绿色和蓝色),从上到下的,用上面显示红色为例,需要这样处理一下(将):

    ANativeWindow_Buffer wbuf;ANativeWindow *native_window = ANativeWindow_fromSurface(env, surface);int32_t re = ANativeWindow_setBuffersGeometry(native_window, 100, 100, WINDOW_FORMAT_RGBA_8888);int curr_format = ANativeWindow_getFormat(native_window);ANativeWindow_lock(native_window, &wbuf, 0);uint32_t color = 0x00ff0000; //红色 RGBAuint32_t *screen = (uint32_t *) wbuf.bits;for (int i = 0; i < 100; i++) {for(int j = 0; j < 100; j++) {screen[i*wbuf.stride + j] = color;}ANativeWindow_unlockAndPost(native_window);

上面的代码相当于越过了蓝色部分的buffer,总的来说,就是buffer的大小可能和图片的大小不符,所以需要使用到stride变量来处理。

更多推荐

android native

本文发布于:2024-03-23 17:00:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1740626.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:android   native

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!