转自:http://blog.csdn.net/leesphone/archive/2010/05/09/5572822.aspx
前几天碰到一个问题,需要做一张全黑的raw data给encode压码测试,因为raw data的格式是YUV的,于是相当然的就把所有值全置为0,因为Y值(亮度)置为0了,所以以为圧码出来的frame就应该是黑色的,可压完才发现是粉色的,这下晕了,因为全黑对于RGB就意味着全0, 于是赶紧找找RGB跟YUV格式转换的算法。
这 是YUV转RGB的
R= 1.0Y + 0 +1.402(V-128)
G= 1.0Y - 0.34413 (U-128)-0.71414(V-128)
B= 1.0Y + 1.772 (U-128)+0
看完这一下就清楚了,YUV为全0时,RGB并不为全0,要想压全黑的,必须是:
Y = 0;
U = V = 128;
于是重新做了一份raw data, 压完一看,果然全黑了。
附RGB转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
YV12格式与IYUV类似,每个像素都提取Y,在UV提取时,将图像2 x 2的矩阵,每个元素中提取一个U和一个V。YV12格式和I420格式的不同处在V平面和U平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。NV12与YV12类似,效果一样,YV12中 U 和 V 是连续排列的,而在NV12中,U 和 V 就交错排列的。