【问题标题】:How to change UILabel text color based on the color of background image? (iOS)如何根据背景图像的颜色更改 UILabel 文本颜色? (iOS)
【发布时间】:2018-07-13 13:40:46
【问题描述】:

我想根据背景图像的颜色更改 UILabel 的文本颜色。例如,当存在深色背景图像时,将 UILabel 文本颜色的颜色更改为白色,反之亦然。

【问题讨论】:

    标签: ios swift xcode image uilabel


    【解决方案1】:

    这是一种方法 - 这不是我的工作...我在 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 评论的那样,这可能不会给您想要的结果。图像,尤其是照片,具有不同的明暗像素/区域。例如,在明亮的天空下,您可能有一座黑暗的建筑物 --- 如果标签开始于建筑物并结束于天空,则检查边界矩形的“黑暗度”对您没有多大帮助。

    另一种方法是使用白色文本,文本后面有一个深色、半透明的矩形(圆角、软边)。

    【讨论】:

    • 这种方法不适用于一般照片。带有标签的区域可以同时具有亮像素和暗像素。您不能只选择浅色文本或深色文本并使其在所有情况下都可读。
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2013-11-29
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多