三种常见的颜色格式及其转换:RGB、YUV、CMYK
彩色记录的格式有很多种,常见的有RGB、YUV、CMYK这三种。RGB是运用最广的颜色系统之一;YUV的发明用于彩色电视与黑白电视的过渡;CMYK即印刷色彩模式,顾名思义就是用来印刷的。
Android开发中用到的主要是RGB,详见Color详解一文。
1、常见的三种颜色格式
1.1、RGB格式
RGB模式是一种发光的色彩模式,诉求于人眼对色彩的感应。RGB图像具有三个通道:R、G、B,分别对应红、绿、蓝三个分量,三原色之间的组合是1670万种的颜色。
通常,还会给RGB图像加一个通道Alpha,即透明度,于是共有四个分量共同控制颜色(ARGB)。
1.2、YUV格式
YUV是一种模拟型号。 Y表示明亮度,U/V表示的则是色度,量化前取值范围:Y∈ [0,1] U,V∈[-0.5,0.5]。其它YUV格式有:YCbCr,YPbPr、YUY2、YUYV、YVYU、UYVY、AYUV等。
1.3、CMYK格式
CMYK是一种依靠反光的色彩模式,也称作印刷色彩模式。是一种专门针对印刷设定的颜色标准,通过对青(C)、洋红(M)、黄(Y)、黑(K)四个颜色变化以及它们相互之间的叠加来得各种颜色。
2、颜色空间转换
不同颜色格式可以相互转换,只是不同的色彩空间的转换公式是不一样的,且较为复杂。Android中也有和颜色转换相关的方法,比如ColorMatrix类中就有颜色转换的方法。
2.1、RGB to YUV
参考ColorMatrix类中的setRGB2YUV()方法。
/**
* Y = 0.299 R + 0.587 G + 0.114 B
* U = -0.1687 R - 0.3313 G + 0.5 B + 128
* V = 0.5 R - 0.4187 G - 0.0813 B + 128
*/
public static float[] rgb2YUV(float R, float G, float B) {
float Y = 0.299f * R + 0.587f * G + 0.114f * B;
float U = -0.1687f * R - 0.3313f * G + 0.5f * B + 128;
float V = 0.5f * R - 0.4187f * G - 0.0813f * B + 128;
return new float[]{Y, U, V};
}
2.2、YUV to RGB
参考ColorMatrix类中的setYUV2RGB()方法。
/**
* R = Y + 1.402 (V-128)
* G = Y - 0.34414 (U-128) - 0.71414 (V-128)
* B = Y + 1.772 (U-128)
*/
public static float[] yuv2RGB(int Y, int U, int V) {
float R = Y + 1.402f * (V - 128);
float G = Y - 0.34414f * (U - 128) - 0.71414f * (V - 128);
float B = Y + 1.772f * (U - 128);
return new float[]{R, G, B};
}
2.3、RGB to CMYK
RGB转换成CMYK的方法:
/**
* R‘ =R/255
* G‘ =G/255
* B‘ = B/255
*
* K= 1-max(R‘,G‘,B‘)
* C= (1-R‘-K) / (1-K)
* M= (1-G‘-K) / (1-K)
* Y= (1-B‘-K) / (1-K)
*/
public static float[] rgb2CMYK(float R, float G, float B) {
float R_ = R / 255;
float G_ = G / 255;
float B_ = B / 255;
float K = 1 - Math.max(R_, Math.max(G_, B_));
float C = (1 - R_ - K) / (1 - K);
float M = (1 - G_ - K) / (1 - K);
float Y = (1 - B_ - K) / (1 - K);
return new float[]{C, M, Y, K};
}
2.4、CMYK to RGB
CMYK转换成RGB的方法:
/**
* R= 255 × (1-C) × (1-K)
* G= 255 × (1-M) × (1-K)
* B= 255 × (1-Y) × (1-K)
*/
public static float[] cmyk2RGB(float C, float M, float Y, float K) {
float R = 255 * (1 - C) * (1 - K);
float G = 255 * (1 - M) * (1 - K);
float B = 255 * (1 - Y) * (1 - K);
return new float[]{R, G, B};
}
参考资料:
RGB
YUV
CMYK