Сохранить 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)")
    }
}
Другие вопросы по тегам