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

0 0
原创粉丝点击