上篇文章讲了静默认的时候pcm值怎么设置,这篇讲讲屏幕是黑屏时,yuv值怎么设置。
当我们想让yuv设置为一个颜色的时候,我们往往先关注对应的rgb值,因为rgb值比较常用,三原色组成各种颜色的原理更易理解。找到对应的rgb值然后再转换为yuv值。
白色:rgb(255,255,255)
黑色:rgb(0,0,0)
红色:rgb(255,0,0)
绿色:rgb(0,255,0)
蓝色:rgb(0,0,255)
青色:rgb(0,255,255)
紫色:rgb(255,0,255)
可以看到黑色时rgb值都为0。
这里举例uyvy422<—>grb互相转换公式,其他的yuv格式原理相同。
Y = 0.257R + 0.504G + 0.098B + 16
Cb= -0.148R - 0.291G + 0.439B + 128
Cr= 0.439R - 0.368G - 0.071B + 128
R = 1.164(Y-16) + 1.596*(Cr-128)
G = 1.164*(Y-16) - 0.813*(Cr-128) - 0.392*(Cb-128)
B = 1.164*(Y-16) + 2.017*(Cb-128)
注意uyvy422是packet模式在内存中是交叉存储的,如下:
u,y,v,y,u,y,v,y…
以上每个分量就像rgb一样占一个字节存储。关于yuv的planar格式和packet存储格式之前的博客有讲解。
因此想让uyvy422为黑色:
u = 128
y = 16
v = 128
for(int i = 0; i < height * width * 2; i = i + 4)
{
char_buf[i] = 128;
char_buf[i + 1] = 16;
char_buf[i + 2] = 128;
char_buf[i + 3] = 16;
}
其中height x width x 2是因为:
yuv444占height x width x 3个字节
yuv422占height x width x 2个字节
yuv420占height x width x 1.5个字节
这部分之前的博客有详细的解释。
以上实测有效。
![](https://i-blog.csdnimg.cn/blog_migrate/0d6108b524cdd0722dbddcd12096157e.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/1c1655332b870f79ad91e0b03a52d7df.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/0d6108b524cdd0722dbddcd12096157e.jpeg)