我正在构建iOS应用程序的扫描程序组件,目前为止我已经裁剪了结果图像并以正确的视角显示。 现在我需要将彩色图像变成黑白“扫描”文档。如何使用CIFilter将UIImage在Swift中转换为灰度?
我试图使用 - “CIPhotoEffectNoir”,但它更灰度,然后完全黑白。我希望获得100%黑色和100%白色的完整对比图像。
我该如何做到这一点? 感谢
我正在构建iOS应用程序的扫描程序组件,目前为止我已经裁剪了结果图像并以正确的视角显示。 现在我需要将彩色图像变成黑白“扫描”文档。如何使用CIFilter将UIImage在Swift中转换为灰度?
我试图使用 - “CIPhotoEffectNoir”,但它更灰度,然后完全黑白。我希望获得100%黑色和100%白色的完整对比图像。
我该如何做到这一点? 感谢
您可以使用CIColorControls并设置对比度关键kCIInputContrastKey
增加了黑/白的对比如下:
的Xcode 9•斯威夫特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
}
谢谢你,但我有一个问题与对比'返回CIImage(图像:自我)? .applyingFilter(“CIColorControls”,参数:[kCIInputContrastKey:value]) .image' ..如果我使用值'0'作为contarst整个图像变成灰色..所以它是默认的对比度行为? –
检查这篇文章可能有助于http://stackoverflow.com/questions/40178846/convert-uiimage-to-grayscale-keeping-image-quality/40182080#40182080 – Joe
我想你需要解释*灰度*和*完全黑白*之间的差异。 @Joe基本上给了你** CIPhotoEffectNoir ** - 它适用于很多情况(并且是一个非常好的答案)。但通过使用“扫描”,你是否说你需要一个阈值“钳”值,说这个像素** **黑色或白色?它可以完成,但仅限于(1)写入自定义CI内核,(2)允许硬编码或参数化的“钳位”值。 – dfd