最终实现图:
实现思路:
学习完 YUV图片格式 之后,我们就知道了 一张 1920 * 1080 YUV420 图片的大小为 1920 * 1080(Y)+ 1920 * 1080 /4(U)+1920 * 1080 /4(V),
即 1920 *1080 *3/2个byte。图片的前 1920 * 1080个字节 都为 Y ,后面的为UV,即4个Y对应一组UV。如图(类似其他自己脑补)
Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y
U U U U U U U U
V V V V V V V V
了解了图片组成之后,实现思路就很简单了,我们只要把整张图的 YUV 分成 3 份 每份都设置成 相应颜色即可。
在编写代码之前,因为我们要设置的是 YUV颜色分量,但我们通过 “画图” 得到的颜色分量参数 格式为 RGB 的所以我要通过公式 把 RGB 转成 YUV。公式如下:
代码编写:
/*横向显示颜色*/
int LUX_YUV_ChangeHorColor(char *pData)
{
int colorData[3] = {0};
LUX_YUV_Portion_ST pColour[3] = {0};
LUX_YUV_Portion_ST *pColorAddr = NULL;
LUX_YUV_RGB2YUV(255,0,0,&pColour[0]);//LUX_YUV_RGB2YUV
LUX_YUV_RGB2YUV(0,255,0,&pColour[1]);
LUX_YUV_RGB2YUV(0,0,255,&pColour[2]);
for (int i = 0;i < 3;i++)
{
pColorAddr = &pColour[i];
LUX_YUV_ColorDisplay(i ,pColorAddr ,pData);//LUX_YUV_ColorDisplay
}
return 0;
}
/*RGB转YUV分量*/
int LUX_YUV_RGB2YUV(int R,int G,int B,LUX_YUV_Portion_ST *pColourData)
{
pColourData->LUX_YUV_Y = (77*R+150*G+29*B) >> 8;
pColourData->LUX_YUV_U = (-43*R-85*G+128*B+32768) >> 8;
pColourData->LUX_YUV_V = (128*R-107*G-21*B+32768) >> 8;
return 0;
}
int LUX_YUV_ColorDisplay(int Nun,LUX_YUV_Portion_ST *pColor,char *pData)
{
int num = Nun;
memset(pData + LUX_Y_SIZE*num,pColor->LUX_YUV_Y,LUX_Y_SIZE);
memset(pData + LUX_Y_ALL_SIZE + LUX_UV_SIZE*num ,pColor->LUX_YUV_U ,LUX_UV_SIZE);
memset(pData + LUX_YU_ALL_SIZE + LUX_UV_SIZE*num ,pColor->LUX_YUV_V ,LUX_UV_SIZE);
}
注:整个工程在最后一起上传。