Swift 在 MacOS 上 - 如何将 NSImage 保存到磁盘
Swift on MacOS - How to save NSImage to disk
我有以下代码在工作:
let myImage = NSImage(named: "my-image.png")
filter.setValue(myImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
let resultImage = filter.outputImage
如何将过滤后的图像(以 PNG 格式)保存到磁盘?请注意,这是一个 MacOS 版本,其中 UIImage 不可用(Xcode 抛出:尝试导入时没有这样的模块 'UIImage')
您可以从 ciimage 过滤器结果中创建一个 Core Image Context 和 createCGImage。您可以按以下方式进行:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let context = CIContext()
let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
guard
let filter = CIFilter(name: "CISepiaTone"),
let imageURL = Bundle.main.url(forResource: "my-image", withExtension: "png"),
let ciImage = CIImage(contentsOf: imageURL)
else { return }
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
guard let result = filter.outputImage, let cgImage = context.createCGImage(result, from: result.extent)
else { return }
let destinationURL = desktopURL.appendingPathComponent("my-image.png")
let nsImage = NSImage(cgImage: cgImage, size: ciImage.extent.size)
if nsImage.pngWrite(to: destinationURL, options: .withoutOverwriting) {
print("File saved")
}
}
}
您将需要这些扩展来获取 png 表示数据以将生成的图像写入磁盘:
extension NSImage {
var pngData: Data? {
guard let tiffRepresentation = tiffRepresentation, let bitmapImage = NSBitmapImageRep(data: tiffRepresentation) else { return nil }
return bitmapImage.representation(using: .png, properties: [:])
}
func pngWrite(to url: URL, options: Data.WritingOptions = .atomic) -> Bool {
do {
try pngData?.write(to: url, options: options)
return true
} catch {
print(error)
return false
}
}
}
我有以下代码在工作:
let myImage = NSImage(named: "my-image.png")
filter.setValue(myImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
let resultImage = filter.outputImage
如何将过滤后的图像(以 PNG 格式)保存到磁盘?请注意,这是一个 MacOS 版本,其中 UIImage 不可用(Xcode 抛出:尝试导入时没有这样的模块 'UIImage')
您可以从 ciimage 过滤器结果中创建一个 Core Image Context 和 createCGImage。您可以按以下方式进行:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let context = CIContext()
let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
guard
let filter = CIFilter(name: "CISepiaTone"),
let imageURL = Bundle.main.url(forResource: "my-image", withExtension: "png"),
let ciImage = CIImage(contentsOf: imageURL)
else { return }
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
guard let result = filter.outputImage, let cgImage = context.createCGImage(result, from: result.extent)
else { return }
let destinationURL = desktopURL.appendingPathComponent("my-image.png")
let nsImage = NSImage(cgImage: cgImage, size: ciImage.extent.size)
if nsImage.pngWrite(to: destinationURL, options: .withoutOverwriting) {
print("File saved")
}
}
}
您将需要这些扩展来获取 png 表示数据以将生成的图像写入磁盘:
extension NSImage {
var pngData: Data? {
guard let tiffRepresentation = tiffRepresentation, let bitmapImage = NSBitmapImageRep(data: tiffRepresentation) else { return nil }
return bitmapImage.representation(using: .png, properties: [:])
}
func pngWrite(to url: URL, options: Data.WritingOptions = .atomic) -> Bool {
do {
try pngData?.write(to: url, options: options)
return true
} catch {
print(error)
return false
}
}
}