【发布时间】:2018-07-13 13:40:46
【问题描述】:
我想根据背景图像的颜色更改 UILabel 的文本颜色。例如,当存在深色背景图像时,将 UILabel 文本颜色的颜色更改为白色,反之亦然。
【问题讨论】:
标签: ios swift xcode image uilabel
我想根据背景图像的颜色更改 UILabel 的文本颜色。例如,当存在深色背景图像时,将 UILabel 文本颜色的颜色更改为白色,反之亦然。
【问题讨论】:
标签: ios swift xcode image uilabel
这是一种方法 - 这不是我的工作...我在 https://gist.github.com/adamcichy/2d00c7a54009b4a9751ba513749c485e 找到它(在此处重新发布,因为将来链接可能会失败):
extension CGImage {
var isDark: Bool {
get {
guard let imageData = self.dataProvider?.data else { return false }
guard let ptr = CFDataGetBytePtr(imageData) else { return false }
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
}
}
}
extension UIImage {
var isDark: Bool {
get {
return self.cgImage?.isDark ?? false
}
}
}
那么你可以使用(例如):
// default to false (meaning, the image is not dark)
let b = myImageView.image?.isDark ?? false
if b {
// use a light-color for textColor
} else {
// use a dark-color for textColor
}
但这并不是那么简单...您的图像可能有明暗区域,因此您只想计算标签后面的图像区域。但这是一个很好的起点。
编辑: 正如 rmaddy 评论的那样,这可能不会给您想要的结果。图像,尤其是照片,具有不同的明暗像素/区域。例如,在明亮的天空下,您可能有一座黑暗的建筑物 --- 如果标签开始于建筑物并结束于天空,则检查边界矩形的“黑暗度”对您没有多大帮助。
另一种方法是使用白色文本,文本后面有一个深色、半透明的矩形(圆角、软边)。
【讨论】: