Search code examples
swiftmacosnsimagecifilter

How to solve error due to CIFilter on macOS app


I'm new in macOS App but A already done an iOS app. I'll try to convert an image in grayscale

Compilation is ok, but i have this running error at "filter.outputImage"

The errror is : Thread 1: "-[NSImage imageByColorMatchingWorkingSpaceToColorSpace:]: unrecognized selector sent to instance 0x60000201e4e0"

what's wrong ?

import Cocoa
import AppKit

class ViewController: NSViewController {

@IBOutlet weak var Load: NSButton!
@IBOutlet weak var ImageSource: NSImageView!
@IBOutlet weak var ImageNG: NSImageView!


func grayscale(image: NSImage) -> NSImage? {
    
    let width = image.size.width
    let height = image.size.height
    let cgsize = CGSize (width: width, height: height)
    
    let context = CIContext(options: nil)
    if let filter = CIFilter(name: "CIPhotoEffectMono") { //CIPhotoEffectNoir  CIPhotoEffectMono  CIPhotoEffectTonal CIPixellate
        filter.setValue(image, forKey: kCIInputImageKey)
        
        if let output = filter.outputImage {
            if let cgImage = context.createCGImage(output, from: output.extent) {
                return NSImage(cgImage : cgImage, size: cgsize)
            }
        }
    }
    return nil
}

@IBAction func LoadButtonClicked(_ sender: Any) {
    
    ImageSource.image = NSImage(named:"IMAGE")
    let imageNG = grayscale(image:  ImageSource.image! )
    ImageNG.image = imageNG
    
}

override func viewDidLoad() {
    super.viewDidLoad()
}

override var representedObject: Any? {
    didSet {
    }
}

}


Solution

  • The value for kCIInputImageKey is a CIImage object, not an NSImage: https://developer.apple.com/documentation/coreimage/kciinputimagekey.

    Perhaps something like this:

    if let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) {
        filter.setValue(CIImage(cgImage: cgImage), forKey: kCIInputImageKey)
    }