最终实现图:
实现思路:
在之前的基础上(不了解的同学,请移步之前同系列文章),实现以上效果图思路也很简单。但需要知道,YUV图片像素点是从左往右 一行一行的刷的。所以实现上方图,就需要在 特定偏移量 来个断层。如图:
Y 分量的话 我们就需要 将每一行的 640 前设为 红色的 Y 分量,640-1280设为绿色的 Y 分量 ,1280-1920 设为蓝色的 Y 分量。在代码中用循环去写就可以了 UV同理 。
代码编写:
/*纵向显示颜色*/
int LUV_YUV_coloes_change_Vertical(char *pData)
{
int width_addr = 0;
int height_addr = 0;
int width = 0;
int height = 0;
int width_ch = LUX_YUV_WIDTH / LUX_YUV_NUM;
const int vDataStart = LUX_Y_ALL_SIZE + 960 * 540;
LUX_YUV_ALL_ST *pColour = NULL;
pColour = (LUX_YUV_ALL_ST *)malloc(sizeof(LUX_YUV_ALL_ST));
if (NULL == pColour)
{
perror("malloc pColour error");
return -1;
}
LUX_YUV_RGB2YUV(255,0,0,&pColour->colour[0]);
LUX_YUV_RGB2YUV(0,255,0,&pColour->colour[1]);
LUX_YUV_RGB2YUV(0,0,255,&pColour->colour[2]);
for(height = 0; height < LUX_YUV_HEIGHT; height++)
{
for(width = 0; width < LUX_YUV_NUM; width++)
{
width_addr = width*width_ch;
height_addr = height*LUX_YUV_WIDTH;
memset(pData + height_addr + width_addr,pColour->colour[width].LUX_YUV_Y,width_ch);
}
}
for(height = 0; height < LUX_YUV_HEIGHT/2; height++)
{
for(width = 0; width < LUX_YUV_NUM; width++)
{
width_addr = width*width_ch/2;
height_addr = height*LUX_YUV_WIDTH/2;
memset(pData + LUX_Y_ALL_SIZE + width_addr + height_addr,pColour->colour[width].LUX_YUV_U,width_ch/2);
memset(pData + vDataStart + width_addr + height_addr,pColour->colour[width].LUX_YUV_V,width_ch/2);
}
}
free(pColour);
return 0;
}
纵向显示最主要的就是偏移量控制的问题,只要确定了偏移量,就简单了。
注:整个工程在最后一起上传。