Как получить темный тон (оттенок) от изображения, как твиттер в iOS - PullRequest
0 голосов
/ 31 августа 2018

Я хочу получить аналогичный эффект, который использует твиттер при поиске изображений в полноэкранном режиме. Есть ли какой-нибудь алгоритм для получения самого темного тона или оттенка изображения?

Добавление желаемого эффекта:

https://i.stack.imgur.com/JMEGX.jpg

https://i.stack.imgur.com/zPLjH.jpg

https://i.stack.imgur.com/MdAXP.jpg

В настоящее время используется следующий код для получения среднего цвета:

func averageColor() -> UIColor {
    var bitmap = [UInt8](repeating: 0, count: 4)

    if #available(iOS 9.0, *) {
        // Get average color.
        let context = CIContext()
        let inputImage: CIImage = ciImage ?? CoreImage.CIImage(cgImage: cgImage!)
        let extent = inputImage.extent
        let inputExtent = CIVector(x: extent.origin.x, y: extent.origin.y, z: extent.size.width, w: extent.size.height)
        let filter = CIFilter(name: "CIAreaAverage", withInputParameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: inputExtent])!
        let outputImage = filter.outputImage!
        let outputExtent = outputImage.extent
        assert(outputExtent.size.width == 1 && outputExtent.size.height == 1)

        // Render to bitmap.
        context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: kCIFormatRGBA8, colorSpace: CGColorSpaceCreateDeviceRGB())
    } else {
        // Create 1x1 context that interpolates pixels when drawing to it.
        let context = CGContext(data: &bitmap, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
        let inputImage = cgImage ?? CIContext().createCGImage(ciImage!, from: ciImage!.extent)

        // Render to bitmap.
        context.draw(inputImage!, in: CGRect(x: 0, y: 0, width: 1, height: 1))
    }

    // Compute result.
    let result = UIColor(red: CGFloat(bitmap[0]) / 255.0, green: CGFloat(bitmap[1]) / 255.0, blue: CGFloat(bitmap[2]) / 255.0, alpha: CGFloat(bitmap[3]) / 255.0)
    return result
}
...