酢ろぐ!

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

SwiftでUIColorからYCbCrを計算する

コード自体はいままで何回も書いている気がしますが、自分のブログを探しても見つからなかったので、次にSwiftでRGBからYCbCrを計算したいときにコピペして使うようにの備忘録として記事を残しておきます。

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

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

UIColorからYCbCrを求める

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

struct YCbCr {
    let y: CGFloat
    let cb: CGFloat
    let cr: CGFloat
    
    static var zero: YCbCr {
        return YCbCr(y: 128, cb: 128, cr: 128)
    }
}

extension UIColor {
    
    func ycbcr() -> YCbCr? {
        guard let comp = self.cgColor.components else {
            return nil
        }
        
//        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
        
        let red = comp[0] * 255
        let blue = comp[1] * 255
        let green = comp[2] * 255
        
        let y = 0.257 * red + 0.504 * blue + 0.098 * green + 16
        let cb = -0.148 * red - 0.291 * blue + 0.439 * green + 128
        let cr = 0.439 * red - 0.368 * blue - 0.071 * green + 128
        
        return YCbCr(y: y, cb: cb, cr: cr)
    }
    
}