NSImage в NSData, затем в UIImage

Я создаю plist из моего приложения OSX, которое содержит некоторые изображения. Я пишу изображение:

[NSKeyedArchiver archivedDataWithRootObject:self.someImage]

Затем я использую этот файл plist в качестве шаблона для приложения iOS, но здесь я не могу преобразовать файл в UIImage и ни к NSImage (поскольку это только для OSX).

Я получаю эту ошибку:

* Завершение приложения из-за неотображенного исключения "NSInvalidUnarchiveOperationException", причина: "*- [NSKeyedUnarchiver decodeObjectForKey:]: не может декодировать объект класса (NSImage) '

Пожалуйста, предложите мне способ выполнить описанное выше.

Ответ 1

OS X:
Вместо использования NSKeyedArchiver для преобразования NSImage в NSData, используйте метод NSImage TIFFRepresentation:

NSData *imageData = [self.someImage TIFFRepresentation];
// save imageData to file

IOS:
Считайте данные изображения из файла, затем преобразуйте их в UIImage, используя UIImage +imageWithData: удобный конструктор:

NSData *imageData = ...; // load imageData from file
UIImage *image = [UIImage imageWithData: imageData];

Ответ 2

Вам нужно создать NSBitmapImageRep, а затем сохранить его, а затем прочитать NSData до UIImage с помощью +[UIImage imageWithData:]:

Сначала в OS X сохраните данные:

NSString *filepath;
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithContentsOfFile:filepath];

NSData *data = [imageRep representationUsingType:NSPNGFileType properties:nil];
// Save the data

Вы также можете использовать imageRepWithData:, если у вас уже есть NSData изображения - выше будет загружать его из файла (например, вы можете также делать с NSImage).

Тогда в iOS:

NSData *data; // Load from a file
UIImage *image = [UIImage imageWithData:data];

Смотрите здесь для других разрешенных клавиш для словаря в representationUsingType:properties:.

Ответ 3

Вы можете преобразовать NSImage в NSData с помощью встроенного API-интерфейса Apple следующим образом:

UIImage *MyImage = [UIImage imageNamed:@"WhateverDir/MyImage.png"];
NSData *MyImageData = UIImagePNGRepresentation(MyImage);