我正在尝试覆盖人字形按钮,以允许用户关闭当前视图。人字形的颜色在深色图像上应该是浅色,在深色图像上应该是深色。我已经附上了我正在描述的屏幕截图。
但是,在尝试计算图像的明暗度时,会对性能产生重大影响,我正在这样做(对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的顶部(例如,图像可能会放大并居中) 。在通过宽高比调整图像后,是否可以仅将出现在人字形框下方的图像部分隔离出来?
这里有几个选项,可将图像安装到视图后查找图像的尺寸: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进行处理的方法,但是获得平均值是最简单的。