上篇文章讲了静默认的时候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个字节
这部分之前的博客有详细的解释。
以上实测有效。