2017-03-25 1 views
1

Ich baue eine Scanner-Komponente für eine iOS App bis jetzt habe ich das Ergebnis Bild abgeschnitten und in der richtigen Perspektive. Jetzt muss ich das Farbbild in schwarz-weiß "gescannt" Dokument zu machen.Wie kann ich in Swift mit CIFilter ein UIImage in Graustufen konvertieren?

Ich versuchte zu verwenden - "CIPhotoEffectNoir" aber es mehr Graustufen dann völlig schwarz und weiß. Ich möchte ein komplettes Kontrastbild mit 100% Schwarz und 100% Weiß erhalten.

Wie kann ich das erreichen? Dank

+0

überprüfen kann diesen Beitrag http://stackoverflow.com/questions/40178846/convert-uiimage-to-grayscale-keeping-image-quality/40182080#40182080 helfen – Joe

+0

Ich glaube, Sie muss den Unterschied zwischen * Graustufen * und * total schwarz und weiß * erklären. @Joe gab dir grundsätzlich ** CIPhotoEffectNoir ** - das funktioniert in vielen Fällen (und ist eine sehr gute Antwort). Aber sagen Sie mit "Gescannt", dass Sie einen Schwellenwert "Klammer" Wert benötigen, der besagt, dass dieses Pixel ** entweder ** schwarz oder weiß? Es kann gemacht werden, aber nur mit (1) einem kundenspezifischen CI-Kernel, der (2) entweder einen fest codierten oder parametrisierten "Klammer" -Wert erlaubt. – dfd

Antwort

5

Sie CIColorControls und setzen Kontrast Key kCIInputContrastKey können die Schwarz/Weiß-Kontrast wie folgt zu erhöhen:

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 
} 

Um zu konvertieren von Farben in Graustufen Sie die Sättigung Key kCIInputSaturationKey auf Null setzen:

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

Danke Mann, aber ich habe ein Problem mit Kontrast 'return CIImage (image: self)? .applyingFilter ("CIColorControls", Parameter: [kCIInputContrastKey: value]) .image' .. Wenn ich den Wert '0' für contarst benutze, wird das ganze Bild grau ... also ist es Standardverhalten für Kontraste? –

2
  1. Desaturate Ihr Bild konvertieren
  2. Erhöhung der Kontrast in Graustufen werden diese abgeblendet auf die Spitze schieben, zB schwarz und weiß.

Sie können CIColorControls:

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

Original:

Original

Mit inputContrast = 1 (Standard):

inputContrast = 1

Mit inputContrast = 5:

inputContrast = 5

Verwandte Themen