获取UIImage的平均颜色

3
我正在尝试做类似Twitter和许多其他应用程序的事情 - 将背景设置为图像的平均颜色。问题在于,基于我拥有的图像数组,它获取最后一个平均颜色并且从未更改。这是那些图像所在的UIScrollView的背景颜色,我不确定原因。
以下是我使用的代码来提取平均颜色(PS:我在此处找到它)。
import UIKit

extension UIImage {
    var averageColor: UIColor? {
        guard let inputImage = CIImage(image: self) else { return nil }
        let extentVector = CIVector(x: inputImage.extent.origin.x, y: inputImage.extent.origin.y, z: inputImage.extent.size.width, w: inputImage.extent.size.height)

        guard let filter = CIFilter(name: "CIAreaAverage", withInputParameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: extentVector]) else { return nil }
        guard let outputImage = filter.outputImage else { return nil }

        var bitmap = [UInt8](repeating: 0, count: 4)
        let context = CIContext(options: [kCIContextWorkingColorSpace: kCFNull])
        context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: kCIFormatRGBA8, colorSpace: nil)

        return UIColor(red: CGFloat(bitmap[0]) / 255, green: CGFloat(bitmap[1]) / 255, blue: CGFloat(bitmap[2]) / 255, alpha: CGFloat(bitmap[3]) / 255)
    }
}

下面是在viewDidLoad()中被调用的函数的代码:

    func setScrollView() {
    for  i in stride(from: 0, to: imagelist.count, by: 1) {
        var frame = CGRect.zero
        frame.origin.x = self.scrollView.frame.size.width * CGFloat(i)
        frame.origin.y = 0
        frame.size = self.scrollView.frame.size
        scrollView.isPagingEnabled = true

        let newUIImageView = UIImageView()
        let myImage:UIImage = UIImage(named: imagelist[i])!
        let bgColorFromImage = myImage.averageColor
        newUIImageView.image = myImage
        newUIImageView.frame =  frame

        newUIImageView.contentMode = UIViewContentMode.scaleAspectFit

        scrollView.backgroundColor = bgColorFromImage // Changes the color to the average color of the image
        scrollView.addSubview(newUIImageView)

        self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * CGFloat(imagelist.count), height: self.scrollView.frame.size.height)
        pageControl.addTarget(self, action: #selector(changePage), for: UIControlEvents.valueChanged)
    }
}
1个回答

1

我想通了。我需要创建一个UIColor数组来存储所有图片的颜色:

var colors = [UIColor]()

然后在setScrollView()中添加颜色,如下:
colors.append(myImage.averageColor!)

最后,在scrollViewDidEndDecelerating(_ scrollView: UIScrollView)中设置背景,如下所示:
scrollView.backgroundColor = colors[Int(pageNumber)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接