检查UIImage的子部分是浅还是暗

问题描述 投票:1回答:1

我正在尝试覆盖人字形按钮,以允许用户关闭当前视图。人字形的颜色在深色图像上应该是浅色,在深色图像上应该是深色。我已经附上了我正在描述的屏幕截图。

enter image description here

但是,在尝试计算图像的明暗度时,会对性能产生重大影响,我正在这样做(对CGImage进行操作):

var isDark: Bool {
    guard let imageData = dataProvider?.data else { return false }
    guard let ptr = CFDataGetBytePtr(imageData) else { return false }
    let length = CFDataGetLength(imageData)
    let threshold = Int(Double(width * 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
}

此外,例如,如果人字形下方的特定区域较暗,但图像的其余部分较浅,则效果不好。

我想只对图像的一小部分进行计算,因为人字形非常小。我尝试使用CGImage的cropping(to rect: CGRect)裁剪图像,但是挑战在于将图像设置为宽高比,这意味着UIImageView框架的顶部不是UIImage的顶部(例如,图像可能会放大并居中) 。在通过宽高比调整图像后,是否可以仅将出现在人字形框下方的图像部分隔离出来?

ios swift uiimage cgimage
1个回答
0
投票

这里有几个选项,可将图像安装到视图后查找图像的尺寸:How to know the image size after applying aspect fit for the image in an UIImageView

一旦掌握了这一点,就可以找出人字形的位置(您可能需要先转换其帧https://developer.apple.com/documentation/uikit/uiview/1622498-convert

如果仍然缺乏性能,我会考虑使用CoreImage进行计算:https://www.hackingwithswift.com/example-code/media/how-to-read-the-average-color-of-a-uiimage-using-ciareaaverage

有几种使用CoreImage进行处理的方法,但是获得平均值是最简单的。

© www.soinside.com 2019 - 2024. All rights reserved.