Я пытаюсь применить следующий код для раскрашивания изображения, взятого из галереи:
func zoeFilter() -> UIImage? {
let brownColor = UIColor (red: 128/255, green: 0, blue: 0, alpha: 1)
let colorRect = CGRect (origin: .zero, size: self.size)
let renderer = UIGraphicsImageRenderer (bounds: colorRect)
let brownColoredImage = renderer.image { ctx in
ctx.cgContext.setFillColor(greyColor.cgColor)
ctx.fill(colorRect)
}
let outBrown0Image = renderer.image { ctx in
ctx.cgContext.setFillColor(UIColor.white.cgColor)
ctx.fill(colorRect)
self.draw(in: colorRect, blendMode: .normal, alpha: 1)
brownColoredImage.draw(in: colorRect, blendMode: .colorDodge, alpha: 1)
}
let outBrownImage = renderer.image { ctx in
self.draw(in: colorRect, blendMode: .normal, alpha: 1)
outBrown0Image.draw(in: colorRect, blendMode: .multiply, alpha: 1)
}
return outBrownImage
}
Но обработка изображения занимает около 14 секунд, что не очень хорошо для пользователя ...
Знаете ли вы, как получить такой же результат, но ускорить обработку изображения?
У вас есть совет?
Заранее спасибо!
ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ
func zoeFilter() -> UIImage? {
let inImage = CIImage (image: self)
let SRGBImage = inImage?.applyingFilter("CILinearToSRGBToneCurve")
let brownColor = CIColor (red: 128/255, green: 0, blue: 0, alpha: 1)
let colorRect = CGRect (origin: .zero, size: self.size)
dynamic let colorFilter = CIFilter(name: "CIConstantColorGenerator")
dynamic let colorizeFilter = CIFilter (name: "CIColorDodgeBlendMode")
dynamic let multiplyFilter = CIFilter (name: "CIMultiplyBlendMode")
colorFilter?.setValue(brownColor, forKey: kCIInputColorKey)
let brownSolidImage = colorFilter?.outputImage?.cropped(to: colorRect)
colorizeFilter?.setValue(SRGBImage, forKey: kCIInputBackgroundImageKey)
colorizeFilter?.setValue(brownSolidImage, forKey: kCIInputImageKey)
let outBrown0Image = colorizeFilter?.outputImage
multiplyFilter?.setValue(SRGBImage, forKey: kCIInputBackgroundImageKey)
multiplyFilter?.setValue(outBrown0Image, forKey: kCIInputImageKey)
let outBrownImage = multiplyFilter?.outputImage
let linearImage = outBrownImage?.applyingFilter("CISRGBToneCurveToLinear")
let cgImage = CIContext().createCGImage(linearImage!, from: linearImage!.extent)
return UIImage (cgImage: cgImage!)
}