酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

AndroidでColorからYCbCrを計算する

iOSでUIColorからYCbCrを求めました。

本記事ではAndroid-JavaでColorからYCbCrを計算してみました。

YCbCrのフォーマットについて

12年ほど前にRGB888からYCbCr422に変換するC言語のコードを書いていたようです。当時はカメラモジュールから取得したYCbCr422をパソコンでみるためのビューアアプリを作るため、テストデータとしてRGB888からYCbCrに変換するコードを書いていました。

ColorからYCbCrを求める

ColorからYCbCrを求めてみました。今回も YCbCr-RGBの変換について詳しく書かれているこちらのサイトを参考にさせて頂きました。

public class YCbCr {

    public double y;
    public double cb;
    public double cr;

    public YCbCr(double y, double cb, double cr) {
        this.y = y;
        this.cb = cb;
        this.cr = cr;
    }

    public static YCbCr zero() {
        return new YCbCr(128, 128, 128);
    }
}
import android.graphics.Color;

public class ColorUtil {

    public static YCbCr convertYCbCr(int color) {
        final double red = (double) Color.red(color);
        final double green = (double) Color.green(color);
        final double blue = (double) Color.blue(color);

        //  ITU-R BT.601に基づいた計算式を使用しております
        //  Y =   0.257R + 0.504G + 0.098B + 16
        //  Cb = -0.148R - 0.291G + 0.439B + 128
        //  Cr =  0.439R - 0.368G - 0.071B + 128

        final double y = 0.257 * red + 0.504 * blue + 0.098 * green + 16;
        final double cb = -0.148 * red - 0.291 * blue + 0.439 * green + 128;
        final double cr = 0.439 * red - 0.368 * blue - 0.071 * green + 128;

        return new YCbCr(y, cb, cr);
    }
}