在一个外国网站上看到一段YUV转RGB的程序很不错,根据维基上的知识,方法应该是没问题的,自己也用过了,效果没问题。

首先说一下android上preview中每一帧的信息都是YUV420的,或者叫NV21,又或者叫YCbCr_420_SP (NV21),反正这么个东西呢,Y,U,V三个分量的数量比是4:1:1.也就是说每四个像素共用一对UV。举个例子,如果是一个30*40的帧,那么有1200个Y分量,分别有300个U和300个V分量。总共有1200*1.5这么多个值。如果调用android中的onPreviewFrame(byte[] data,Cameracamera)这个方法,data就是这一帧的数据。数据是这么排列的:

首先是Y分量(亮度)

Y....

Y....

接着是v,u分量成对出现

(v,u),(v,u)......

(v,u),(v,u)......

然后讲一下共用的v,u问题

比如图像是4*4的:

Y11,Y12,Y13,Y14

Y21,Y22,Y23,Y24

Y31,Y32,Y33,Y34

Y41,Y42,Y43,Y44

V,U分量是这样的:

(V1,U1),(V2,U2)

(V3,U3),(V4,U4)

其中,

Y11,Y12,

Y21,Y22,

共用

(V1,U1)

Y13,Y14

Y23,Y24

共用

(V2,U2)

其他的同理。

根据以上的介绍,我们就可以写程序了,程序如下:

    int yy,v,u;   //三个分量    int frame_size=width*height;    int p_y=x*width+y; //当前像素点y分量的位置    int p_v=frame_size+(x >> 1) * width + (y& ~1) + 0; //当前像素点v分量的位置    int p_u=frame_size+(x >> 1) * width + (y& ~1) + 1; //当前像素点u分量的位置    yy=pSrc[p_y];    v=pSrc[p_v];    u=pSrc[p_u];    yy = yy-16>0 ? yy-16 : 0;     v= v-128>0?v-128:0;    u=u-128>0?u-128:0; //开始转化成rgb    unsigned char r = (unsigned char) ((116 *(int)yy + 160 *(int)v)/100);    unsigned char g = (unsigned char) ((116 * (int)yy - 81 * (int)v - 39 * (int)u)/100);    unsigned char b = (unsigned char) ((116 * (int)yy + 202 * (int)u)/100);

更多相关文章

  1. 闲话Android(安卓)之 屏幕大小、pixel、分辨率、dpi、dip
  2. Android设计中的.9.png与Android(安卓)Studio中的设置
  3. iOS和Android交互设计
  4. Android图片特效处理(像素处理)
  5. android中单位的简单介绍
  6. 【.9.img】Android设计中的.9.png
  7. Android(安卓)Tips -- Tip01
  8. android设备分辨率获取的一种新方法
  9. Android学习笔记之界面控件大小dip及布局管理器嵌套使用

随机推荐

  1. J2EE4层体系结构
  2. java 导出excel 格式与文件扩展名指定的
  3. 2016年团体程序设计天梯赛-初赛 - 重要的
  4. 打造Linux下vim之(一)vim中的JavaScript插
  5. java对象判断是否为空工具类
  6. ARM-LINUX 系列 (七) ----java的安装
  7. eclipse下,tomact jar包存在 但是无法解析
  8. 一个关于javascript压缩混淆工具的问题
  9. 百度Java架构师分享分布式锁的技术选型及
  10. Java常用类及其常用方法