android camera ycbcr420sp转为rgb

本文介绍了如何将Android手机上通过previewcallback获取的ycbcr420sp格式图像转换为rgb24格式。ycbcr420sp存储时,会开辟1.5倍宽度的内存,前部分存储Y,后部分存储CbCr。提供了一个详细的ycrcb2rgb转换C语言代码示例,用于将YUV420SP转换为RGB。

获取android 手机上的图片,可以设定获取的图形格式,包括

对于通过调用previewcallback获取的原始ycbcr420sp格式的图像,通常要将其转换为rgb24格式的,才能进一步显示或处理。

对于ycbcr420sp存储的格式,(YYYYCbCr),在实际的存储空间中,假设获取的图片的大小是720×480的,则将会开辟一块720×480×1.5大小的存储区域来存储,前720×480存取的是Y,后720×240存储的是CbCr即:

排列方式: YYYY..............................YYYY

.  .

..

.            .

  YYYY   YYYY

 CrCb..................................CrCb

    ...........................................


c的ycrcb2rgb转换代码是:

int YUV2RGBU(void* pYUV, void* pRGB, int width, int height)
{
if (NULL == pYUV)  
    {  
        return -1;  
    }  
    unsigned char* pYUVData = (unsigned char *)pYUV;  
    unsigned char* pRGBData = (unsigned char *)pRGB;  
    if (NULL == pRGBData)  
    {  
pRGBData = new unsigned char[width*height*3];  
    }  
int Y0, U0, Y1, Y2, V2, Y3, R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4;  
    int C1, D1, E1, C2, C3, C4;
for(int i=0;i<height/2;i++)
{
for(int j=0;j<width/2;j++)
{
Y0 = *(pYUVData+2*i*width+j*2);
Y1 = *(pYUVData +2*i*width+j*2+1);
Y2 = *(pYUVData +(2*i+1)*width+j*2);
Y3 = *(pYUVData +(2*i+1)*width+j*2+1);
V2 = *(pYUVData + width*height+i*width+2*j);
U0 = *(pYUVData + width*height + i*width + 2*j+1);


C1 = Y0-16;  
            C2 = Y1-16;
C3 = Y2-16;
C4 = Y3-16;
            D1 = U0-128;  
            E1 = V2-128;  
            R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);  
            G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);    
            B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);    
            R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);  
            G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);  
            B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);
R3 = ((298*C3 + 409*E1 + 128)>>8>255 ? 255 : (298*C3 + 409*E1 + 128)>>8);  
            G3 = ((298*C3 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C3 - 100*D1 - 208*E1 + 128)>>8);    
            B3 = ((298*C3+516*D1 +128)>>8>255 ? 255 : (298*C3+516*D1 +128)>>8);    
R4 = ((298*C4 + 409*E1 + 128)>>8>255 ? 255 : (298*C4 + 409*E1 + 128)>>8);  
            G4 = ((298*C4 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C4 - 100*D1 - 208*E1 + 128)>>8);    
            B4 = ((298*C4+516*D1 +128)>>8>255 ? 255 : (298*C4+516*D1 +128)>>8);    
            *(pRGBData+2*i*width*3+j*6+2) = R1<0 ? 0 : R1;  
            *(pRGBData+2*i*width*3+j*6+1) = G1<0 ? 0 : G1;  
            *(pRGBData+2*i*width*3+j*6) = B1<0 ? 0 : B1;  
            *(pRGBData+2*i*width*3+j*6+5) = R2<0 ? 0 : R2;  
            *(pRGBData+2*i*width*3+j*6+4) = G2<0 ? 0 : G2;  
            *(pRGBData+2*i*width*3+j*6+3) = B2<0 ? 0 : B2;


*(pRGBData+(2*i+1)*width*3+j*6+2) = R3<0 ? 0 : R3;  
            *(pRGBData+(2*i+1)*width*3+j*6+1) = G3<0 ? 0 : G3;  
            *(pRGBData+(2*i+1)*width*3+j*6) = B3<0 ? 0 : B3;  


*(pRGBData+(2*i+1)*width*3+j*6+5) = R4<0 ? 0 : R4;  
            *(pRGBData+(2*i+1)*width*3+j*6+4) = G4<0 ? 0 : G4;  
            *(pRGBData+(2*i+1)*width*3+j*6+3) = B4<0 ? 0 : B4;  

}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值