Android Opengl ES2.0 -实现RGB-YUV互转并显示到屏幕
来源:互联网 发布:淘宝买到假货已经下架 编辑:程序博客网 时间:2024/06/06 05:43
使用OpenGL ES2.0实现了 如下三个功能:
1.RGB转YUV420P
2.YUV420P转RGB
3.显示rgb到屏幕
转码过程使用shader实现,但有几点需要注意:
一.RGB转YUV的时候,输入的图的大小的宽度必须是8的倍数,原因如下:
转换后的yuv数据是按如下方式存储的
|||||||||||||||||||||||||||||||||||||| | | || | | || | U | || | | || |______| || Y | | || | V | || | | || | | ||||||||||||||||||||||||||||||||||||||0 0.25 0.375 1.0 (宽度)
其中yuv数据只占了原图3/8的大小,如果宽度不为8的整数倍,则后面一定会出现小数,这时,GPU就可能少取像素了,实测如下:
1500x750的图
实际有效像素为1500 *3/8列 =562.5列,但这里很明显Opengl少处理了一个像素(实际只有半个像素也就是2个字节的U或V)只有562列,因此最终的图最后4列一定不正常。
1520x750
实际有效像素为1520 *3/8列 =570列,是整数,正好opengl也处理到了570,所以出来的图像没问题。
当然会有人问了为什么不直接横着弄成前面全是Y后面跟上UV呢?
这里我有做过一个测试,shader在assets文件夹里,有兴趣可以自己尝试,反正我试出来的图是这样的:
可以看到有很多成块的像素,基本上就是4列4列的块。目前还不知道原因。
二、转码的图宽度还需要小于2044或2048,如果大于2044的图,前面的所有像素都是正常的但2044以后 也是会出现4列4列的块,我也不知道为什么。
测试图3840x2160 ,放大后图的右半部分有明显的4列的痕迹。
三、rgb转yuv和yuv转rgb的颜色转换公式要配对使用,否则会出现偏色的情况。
基本上要注意的就是以上3点。剩下的自己去调试看吧。
示例代码:
http://download.csdn.net/download/nommmmon/9829787
- Android Opengl ES2.0 -实现RGB-YUV互转并显示到屏幕
- Android Opengl ES2.0 -实现小行星显示效果并可触摸控制
- Android用OpenGL ES2.0显示YUV数据,在手机上需要两种坐标系的解决方案
- Android OpenGL ES2.0
- openGL 显卡YUV转RGB
- android YUV转RGB
- openGL 显卡YUV转RGB(转)
- opengl shader yuv转rgb的问题
- QT+Opengl ES2.0显示立方体
- YUV转RGB(Android)
- 用OpenGL shader 实现将YUV转RGB(直接调用GPU实现)
- android中用GLSurfaceview和opengl es2.0显示图片,图片无法正常显示
- opengl es2.0 实现播放器渲染
- android 游戏 OpenGL ES2.0 未完成
- android OpenGL ES2.0编程初学
- Android OpenGL es GPUImage convert YUV to RGB
- 【OpenGL】用OpenGL shader实现将YUV转RGB-(直接调用GPU实现,纯硬件方式,效率高)
- YUV到RGB转换
- 安卓开发 切换简繁体
- Java常用类之【八种基本数据类型】
- IDEA2016.2.4 安装Python
- Codeforces gym 101149 K 想法
- poj 3624 Charm Bracelet
- Android Opengl ES2.0 -实现RGB-YUV互转并显示到屏幕
- 关于人生中的第一篇博客需要注意的一些事情
- 存储过程、存储函数、内部函数三者的区别与联系
- 覆盖索引
- C++类中的static成员学习总结
- 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题
- JavaScript变量、作用域和内存问题(二)——垃圾收集器
- 用Python下载一个网页保存为本地的 HTML文件
- java中的增强型for循环