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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM