Сохранить NSImageView на диск как png/jpg
Я пытаюсь создать изображение из содержимого (всех подпредставлений) NSImageView
и сохранить его на диск на Mac. Прямо сейчас шаг записи этого на диск терпит неудачу. Проходя по коду в отладчике, я замечаю, что imageData
не создается должным образом. Представление Переменных показывает imageData
ценность как some
и когда я смотрю глубже поле backing.bytes
является nil
,
Я думаю, что эта строка:
let imageData: Data! = rep!.representation(using: NSBitmapImageRep.FileType.png, properties: [:])
терпит неудачу. Вот полный код, который я использую:
class ExportableImageView: NSImageView {
func saveToDisk() {
let rep: NSBitmapImageRep! = self.bitmapImageRepForCachingDisplay(in: self.bounds)
self.cacheDisplay(in: self.bounds, to: rep!)
let imageData: Data! = rep!.representation(using: NSBitmapImageRep.FileType.png, properties: [:])
let paths = NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true)
let desktopPath = URL.init(string: paths[0])
let savePath = desktopPath?.appendingPathComponent("test.png")
do {
try imageData!.write(to: savePath!, options: .atomic)
}
catch {
print("save error")
}
}
/* Other stuff */
}
Есть идеи, почему это не получится? Благодарю.
1 ответ
Благодаря Willeke
Предложение, мне нужно было только изменить способ, которым я получаю путь к рабочему столу
let desktopPath = try! fileManager.url(for: .desktopDirectory, in: .allDomainsMask, appropriateFor: nil, create: true)
Вот окончательное решение
func saveToDisk() {
let rep: NSBitmapImageRep! = self.bitmapImageRepForCachingDisplay(in: self.bounds)
self.cacheDisplay(in: self.bounds, to: rep!)
let imageData: Data! = rep!.representation(using: NSBitmapImageRep.FileType.png, properties: [:])
let fileManager = FileManager.default
let desktopPath = try! fileManager.url(for: .desktopDirectory, in: .allDomainsMask, appropriateFor: nil, create: true)
let filePath = desktopPath.appendingPathComponent("test.png")
do {
try imageData.write(to: filePath, options: .atomic)
}
catch {
print("save file error: \(error)")
}
}