android camera ycbcr420sp转为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[widthheight3];
}
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+2iwidth+j2);
Y1 = (pYUVData +2iwidth+j2+1);
Y2 = (pYUVData +(2i+1)width+j2);
Y3 = (pYUVData +(2i+1)width+j2+1);
V2 = (pYUVData + widthheight+iwidth+2j);
U0 = (pYUVData + widthheight + iwidth + 2*j+1);
C1 = Y0-16;
C2 = Y1-16;
C3 = Y2-16;
C4 = Y3-16;
D1 = U0-128;
E1 = V2-128;
R1 = ((298C1 + 409E1 + 128)>>8>255 ? 255 : (298C1 + 409E1 + 128)>>8);
G1 = ((298C1 - 100D1 - 208E1 + 128)>>8>255 ? 255 : (298C1 - 100D1 - 208E1 + 128)>>8);
B1 = ((298C1+516D1 +128)>>8>255 ? 255 : (298C1+516D1 +128)>>8);
R2 = ((298C2 + 409E1 + 128)>>8>255 ? 255 : (298C2 + 409E1 + 128)>>8);
G2 = ((298C2 - 100D1 - 208E1 + 128)>>8>255 ? 255 : (298C2 - 100D1 - 208E1 + 128)>>8);
B2 = ((298C2 + 516D1 +128)>>8>255 ? 255 : (298C2 + 516D1 +128)>>8);
R3 = ((298C3 + 409E1 + 128)>>8>255 ? 255 : (298C3 + 409E1 + 128)>>8);
G3 = ((298C3 - 100D1 - 208E1 + 128)>>8>255 ? 255 : (298C3 - 100D1 - 208E1 + 128)>>8);
B3 = ((298C3+516D1 +128)>>8>255 ? 255 : (298C3+516D1 +128)>>8);
R4 = ((298C4 + 409E1 + 128)>>8>255 ? 255 : (298C4 + 409E1 + 128)>>8);
G4 = ((298C4 - 100D1 - 208E1 + 128)>>8>255 ? 255 : (298C4 - 100D1 - 208E1 + 128)>>8);
B4 = ((298C4+516D1 +128)>>8>255 ? 255 : (298C4+516D1 +128)>>8);
(pRGBData+2iwidth3+j6+2) = R1<0 ? 0 : R1;
(pRGBData+2iwidth3+j6+1) = G1<0 ? 0 : G1;
(pRGBData+2iwidth3+j6) = B1<0 ? 0 : B1;
(pRGBData+2iwidth3+j6+5) = R2<0 ? 0 : R2;
(pRGBData+2iwidth3+j6+4) = G2<0 ? 0 : G2;
(pRGBData+2iwidth3+j6+3) = B2<0 ? 0 : B2;
(pRGBData+(2i+1)width3+j6+2) = R3<0 ? 0 : R3;
(pRGBData+(2i+1)width3+j6+1) = G3<0 ? 0 : G3;
(pRGBData+(2i+1)width3+j*6) = B3<0 ? 0 : B3;
(pRGBData+(2i+1)width3+j6+5) = R4<0 ? 0 : R4;
(pRGBData+(2i+1)width3+j6+4) = G4<0 ? 0 : G4;
(pRGBData+(2i+1)width3+j*6+3) = B4<0 ? 0 : B4;
}
}
return 0;
}
