三种常见的颜色格式及其转换:RGB、YUV、CMYK

Quibbler 2022-5-8 1068

三种常见的颜色格式及其转换: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


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com