UIImage
extension
Swift
判定

UIImageの画像が黒っぽいか白っぽいかどうか判別するExtension

やりたいこと

画像が黒っぽい画像か白っぽい画像かを判定する

実装

1.CGImageのextensionを作成

以下のswiftファイルをプロジェクトに追加する。閾値や明るさの定義は好みで修正していただければと思います。

CGImage+.swift
//
//  CGImage+.swift
//
//  Created by Hiromasa Suzuki on 1/5/17.
//  Copyright (c) 2017 Hiromasa Suzuki. All rights reserved.
//
import UIKit

extension CGImage {
    var isDark: Bool {
        get {
            guard let imageData = self.dataProvider?.data else { return false }

            // ピクセルレベルで画像の色を取得
            guard let ptr = CFDataGetBytePtr(imageData) else { return false }

            // CFDataの長さを返す
            let length = CFDataGetLength(imageData)

            // 閾値(各人で調整)
            let threshold = Int(Double(self.width * self.height) * 0.45)
            var darkPixels = 0

            // 閾値のループ
            for i in stride(from: 0, to: length, by: 4) {
                let r = ptr[i]
                let g = ptr[i + 1]
                let b = ptr[i + 2]

                // 明るさ(各人で調整)
                let luminance = (0.299 * Double(r) + 0.587 * Double(g) + 0.114 * Double(b))
                if luminance < 150 {
                    darkPixels += 1

                    // 閾値を超えたら黒っぽい画像とする
                    if darkPixels > threshold {
                        return true
                    }
                }
            }
            // 最後まで閾値を超えなかったら、白っぽい画像とする
            return false
        }
    }
}

こちらにGist格納してます。
https://gist.github.com/suzuhiroruri/aa83814042bb04120d91c03991f47c89

2.CGImageのextensionを使用する

// 適当にUIImageのインストタンスを生成(適宜変える)
let image:UIImage = UIImage(named:"sample.jpg")!

// extensionを使い、Boolで返却値を取得
guard let isDark = image.cgImage?.isDark else {
  return
}

// 黒っぽいか白っぽいか出力
if isDark {
  print("黒っぽい")
}else{
  print("白っぽい")
}