如何使用CIFilter在Swift中将UIImage转换为灰度? [英] How can I convert an UIImage to grayscale in Swift using CIFilter?
问题描述
到目前为止,我正在为iOS应用构建一个扫描仪组件,我将结果图像以正确的视角进行裁剪。
现在我需要将彩色图像变成黑白扫描文档。
I am building a scanner component for an iOS app so far I have the result image cropped and in the correct perspective. Now I need to turn the color image into Black and white "Scanned" document.
我试图使用 - CIPhotoEffectNoir但它更灰度然后完全黑与白。我希望获得100%黑色和100%白色的完整对比图像。
I tried to use - "CIPhotoEffectNoir" but it more grayscale then totally black and white. I wish to get a full contrast image with 100% black and 100% white.
我如何实现这一目标?
谢谢
How can I achieve that? Thanks
推荐答案
您可以使用CIColorControls并设置对比度键 kCIInputContrastKey
增加黑/白对比度如下:
You can use CIColorControls and set Contrast Key kCIInputContrastKey
to increase the black/white contrast as follow:
Xcode 9•Swift 4
extension UIImage {
func applying(contrast value: NSNumber) -> UIImage? {
guard
let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", parameters: [kCIInputContrastKey: value])
else { return nil } // Swift 3 uses withInputParameters instead of parameters
UIGraphicsBeginImageContextWithOptions(size, false, scale)
defer { UIGraphicsEndImageContext() }
UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: size))
return UIGraphicsGetImageFromCurrentImageContext()
}
}
let link = "https://i.stack.imgur.com/Xs4RX.jpg"
let image = UIImage(data: try! Data(contentsOf: URL(string: link)!))
if let contrastIncreased = image?.applying(contrast: 1.5) {
// use contrastIncreased image here
}
要从颜色转换为灰度,您可以设置饱和度键 kCIInputSaturationKey
为零:
extension CIImage {
var image: UIImage? {
let image = UIImage(ciImage: self)
UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
defer { UIGraphicsEndImageContext() }
image.draw(in: CGRect(origin: .zero, size: image.size))
return UIGraphicsGetImageFromCurrentImageContext()
}
}
extension UIImage {
func applying(saturation value: NSNumber) -> UIImage? {
return CIImage(image: self)?
.applyingFilter("CIColorControls", parameters: [kCIInputSaturationKey: value])
.image
} // Swift 3 uses withInputParameters instead of parameters
var grayscale: UIImage? {
return applying(saturation: 0)
}
}
let link = "https://i.stack.imgur.com/Xs4RX.jpg"
let image = UIImage(data: try! Data(contentsOf: URL(string: link)!))
if let grayscale = image?.grayscale {
// use grayscale image here
}
这篇关于如何使用CIFilter在Swift中将UIImage转换为灰度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!