• android中YUV转RGB的方法


    在一个外国网站上看到一段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, Camera camera)这个方法,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);
  • 相关阅读:
    典型漏洞归纳之上传漏洞
    典型漏洞归纳之解析漏洞
    Python学习目录
    MySQL数据库优化的八种方式
    深度剖析Flask上下文管理机制
    算法十大排序(含动图)
    设计模式代码实例
    设计模式
    数据结构
    算法基础
  • 原文地址:https://www.cnblogs.com/hrlnw/p/3147830.html
Copyright © 2020-2023  润新知