2017-03-25 135 views
1

我正在构建iOS应用程序的扫描程序组件,目前为止我已经裁剪了结果图像并以正确的视角显示。 现在我需要将彩色图像变成黑白“扫描”文档。如何使用CIFilter将UIImage在Swift中转换为灰度?

我试图使用 - “CIPhotoEffectNoir”,但它更灰度,然后完全黑白。我希望获得100%黑色和100%白色的完整对比图像。

我该如何做到这一点? 感谢

+0

检查这篇文章可能有助于http://stackoverflow.com/questions/40178846/convert-uiimage-to-grayscale-keeping-image-quality/40182080#40182080 – Joe

+0

我想你需要解释*灰度*和*完全黑白*之间的差异。 @Joe基本上给了你** CIPhotoEffectNoir ** - 它适用于很多情况(并且是一个非常好的答案)。但通过使用“扫描”,你是否说你需要一个阈值“钳”值,说这个像素** **黑色或白色?它可以完成,但仅限于(1)写入自定义CI内核,(2)允许硬编码或参数化的“钳位”值。 – dfd

回答

5

您可以使用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 
} 
+0

谢谢你,但我有一个问题与对比'返回CIImage(图像:自我)? .applyingFilter(“CIColorControls”,参数:[kCIInputContrastKey:value]) .image' ..如果我使用值'0'作为contarst整个图像变成灰色..所以它是默认的对比度行为? –

2
  1. 去色将转换您的图像灰度
  2. 增加对比度将推动这些灰色出到极端,即黑色和白色。

您可以CIColorControls

let ciImage = CIImage(image: image)! 
let blackAndWhiteImage = ciImage.applyingFilter("CIColorControls", withInputParameters: ["inputSaturation": 0, "inputContrast": 5]) 

原文:

Original

随着inputContrast = 1(默认):

inputContrast = 1

随着inputContrast = 5

inputContrast = 5