Android Opengl ES2.0 -实现RGB-YUV互转并显示到屏幕

使用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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值