43 lines
1.3 KiB
Swift
43 lines
1.3 KiB
Swift
|
//
|
||
|
// CGImage.swift
|
||
|
// Mastodon
|
||
|
//
|
||
|
// Created by MainasuK Cirno on 2021-3-31.
|
||
|
//
|
||
|
|
||
|
import CoreImage
|
||
|
|
||
|
extension CGImage {
|
||
|
// Reference
|
||
|
// https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.709-6-201506-I!!PDF-E.pdf
|
||
|
// Luma Y = 0.2126R + 0.7152G + 0.0722B
|
||
|
public var brightness: CGFloat? {
|
||
|
let context = CIContext() // default with metal accelerate
|
||
|
let ciImage = CIImage(cgImage: self)
|
||
|
let rec709Image = context.createCGImage(
|
||
|
ciImage,
|
||
|
from: ciImage.extent,
|
||
|
format: .RGBA8,
|
||
|
colorSpace: CGColorSpace(name: CGColorSpace.itur_709) // BT.709 a.k.a Rec.709
|
||
|
)
|
||
|
guard let image = rec709Image,
|
||
|
image.bitsPerPixel == 32,
|
||
|
let data = rec709Image?.dataProvider?.data,
|
||
|
let pointer = CFDataGetBytePtr(data) else { return nil }
|
||
|
|
||
|
let length = CFDataGetLength(data)
|
||
|
guard length > 0 else { return nil }
|
||
|
|
||
|
var luma: CGFloat = 0.0
|
||
|
for i in stride(from: 0, to: length, by: 4) {
|
||
|
let r = pointer[i]
|
||
|
let g = pointer[i + 1]
|
||
|
let b = pointer[i + 2]
|
||
|
let Y = 0.2126 * CGFloat(r) + 0.7152 * CGFloat(g) + 0.0722 * CGFloat(b)
|
||
|
luma += Y
|
||
|
}
|
||
|
luma /= CGFloat(width * height)
|
||
|
return luma
|
||
|
}
|
||
|
}
|