Как сохранить CGImage для данных в Swift?

Этот тип кода проверяет и компилирует, но затем падает. Как мне сохранить CGImage в Data так что я могу прочитать это позже.

let cgi: CGImage? = ...        
var mData = Data()
let imageDest = CGImageDestinationCreateWithData(mData as! CFMutableData, 
                                                 kUTTypePNG, 1, nil)!
CGImageDestinationAddImage(imageDest, cgi!, nil)
CGImageDestinationFinalize(imageDest)

Последняя строка вылетает. Ошибка в консоли:

2018-01-17 19:25:43.656664-0500 HelloPencil[2799:3101092] -[_NSZeroData 
  appendBytes:length:]: unrecognized selector sent to instance 0x1c80029c0
2018-01-17 19:25:43.658420-0500 HelloPencil[2799:3101092] *** Terminating app 
  due to uncaught exception 'NSInvalidArgumentException', reason: 
  '-[_NSZeroData appendBytes:length:]: unrecognized selector 
  sent to instance 0x1c80029c0'

Что снимали с Data в CFMutableData был рекомендован XCode, но, возможно, это не так.

1 ответ

Решение

Проблема в том, как вы создаете изменяемые данные. Просто поменяйте принудительный кастинг с Data в CFMutableData в CFDataCreateMutable(nil, 0)

Попробуйте вот так:

if let cgi = cgi, 
    let mutableData = CFDataCreateMutable(nil, 0),
    let destination = CGImageDestinationCreateWithData(mutableData, "public.png" as CFString, 1, nil) {
    CGImageDestinationAddImage(destination, cgi, nil)
    if CGImageDestinationFinalize(destination) {
        let data = mutableData as Data
        if let image = UIImage(data: data) {
            print(image.size)
        }
    } else {
        print("Error writing Image")
    }
}
Другие вопросы по тегам