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

QuibblerQuibbler 2022-05-08 约 7 分钟 2909 次阅读

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

相关推荐

精选
国内开源镜像站点
分享

国内开源镜像站点

国内开源镜像站点开源,(Open Source)全称为开放源代码。开源就是要用户利用源代码在其基础上修改和学习的,但开源系统同样也有版权,同样也受到法律保护。国内的高校和一些企业也建立了开源镜像站点,支持开源。从开源站点上面可以下载很多开源资源(Android源码),上大学的时候就在这些镜像网站上下载Linux发行版、Qt等软件。 清华大学:http://mirrors.tuna.tsinghua

2.4k
R8编译问题:Missing classes detected while running R8
分享

R8编译问题:Missing classes detected while running R8

R8编译问题:Missing classes detected while running R8Android R8是一个代码混淆和压缩工具,可以将应用程序的大小和安全性优化。它引入了一些新功能,如成员内省、混淆指针、类内省等。但R8使用起来一直不友好,因为自从使用R8之后编译问题不断。主要还是和混淆相关,经常报错,最近又遇到一个:Missing classes detected while ru

8.4k
maven { url 'https://jitpack.io' } 无法下载的问题
分享

maven { url 'https://jitpack.io' } 无法下载的问题

解决maven { url 'https://jitpack.io' } 无法下载的问题要使用GitHub上项目的开源库,比如 BRV ,加强版的RecyclerView框架:需要在项目根目录的 build.gradle 添加 jitpack 仓库:以上这些都照做了,却遇到Gradle无法下载依赖的问题。这种情况以前也遇到过,一般是由于网络故障引起的,可以用国内的镜像仓库。尝试了不同方法,仍然无法

6.6k