Search code examples
swift3gpuimagensimage

GPUImage with MacOS - how to save processed file to disk


I'm currently porting bits of code from CoreImage to GPUImage and having a problem saving processed file to disk. While this worked with CoreImage:

guard
    let blurFilter = CIFilter(name: "CIGaussianBlur"),
    let imageURL = Bundle.main.url(forResource: "my-image", withExtension: "png"),
    let ciImage = CIImage(contentsOf: imageURL)
else {
    return
}

blurFilter.setValue(ciImage, forKey: kCIInputImageKey)
blurFilter.setValue(100, forKey: kCIInputRadiusKey)

guard
    let result = blurFilter.outputImage,
    let cgImage = context.createCGImage(result, from: result.extent)
else {
    return
}

let destinationURL = desktopURL.appendingPathComponent("output.png")
let nsImage = NSImage(cgImage: cgImage, size: ciImage.extent.size)

The following code ported to GPUImage:

let testImage = NSImage(named:"my-image.png")!
let blurFilter = GaussianBlur()
let filteredImage = testImage.filterWithOperation(blurFilter)

let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
let destinationURL = desktopURL.appendingPathComponent("output.png")
let nsImage = NSImage(nsImage: filteredImage, size: filteredImage.extent.size)

Gives the following error message pertaining to the last line:

Value type of 'NSImage' has no member 'extent'

Solution

  • filteredImage is an NSImage. In your Core Image code, ciImage is a, well, CIImage. CIImage has an extent property, NSImage does not.

    There's no need to create nsImage in your second code, filteredImage is already an NSImage. You're done.