【发布时间】:2016-08-16 18:21:28
【问题描述】:
我想构建一个让用户选择图像并输出“平均颜色”的应用。
例如这张图片:
平均颜色为绿色/黄色。
此刻,我得到了这个代码:
// In a UIColor extension
public static func fromImage(image: UIImage) -> UIColor {
var totalR: CGFloat = 0
var totalG: CGFloat = 0
var totalB: CGFloat = 0
var count: CGFloat = 0
for x in 0..<Int(image.size.width) {
for y in 0..<Int(image.size.height) {
count += 1
var rF: CGFloat = 0,
gF: CGFloat = 0,
bF: CGFloat = 0,
aF: CGFloat = 0
image.getPixelColor(CGPoint(x: x, y: y)).getRed(&rF, green: &gF, blue: &bF, alpha: &aF)
totalR += rF
totalG += gF
totalB += bF
}
}
let averageR = totalR / count
let averageG = totalG / count
let averageB = totalB / count
return UIColor(red: averageR, green: averageG, blue: averageB, alpha: 1.0)
}
其中getPixelColor定义为:
extension UIImage {
func getPixelColor(pos: CGPoint) -> UIColor {
let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
如您所见,我在这里所做的非常幼稚:我循环遍历图像中的所有像素,将它们的 RGB 相加,然后除以计数。
当我运行应用程序并选择图像时,应用程序冻结。我知道这是因为图片太大,嵌套的两个for循环执行了太多次。
我想找到一种方法来有效地获取图像的平均颜色。我该怎么做?
【问题讨论】:
-
@EricD 哦!为什么我没有想过调整图像大小?但我可以将其调整为 1x1 图像吗?这样我就不需要丢弃噪音。我说的对吗?
标签: ios swift colors average pixel