Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSImage to NSData, then to UIImage

I am creating a plist from my OSX app that contains some images. I am writing the image by :

[NSKeyedArchiver archivedDataWithRootObject:self.someImage]

Then I am using this plist file as a template for iOS app, but here I can't convert the file to UIImage and neither to NSImage(as this is only for OSX).

I am getting this error:

* Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (NSImage)'

Please suggest me a way to perform the above.

like image 665
Anoop Vaidya Avatar asked Apr 24 '14 14:04

Anoop Vaidya


2 Answers

OS X:
Instead of using NSKeyedArchiver to convert an NSImage to NSData, use NSImage's TIFFRepresentation method:

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

iOS:
Read the image data from the file, then convert it to a UIImage using UIImage's +imageWithData: convenience constructor:

NSData *imageData = ...; // load imageData from file
UIImage *image = [UIImage imageWithData: imageData];
like image 97
Josh Freeman Avatar answered Oct 20 '22 12:10

Josh Freeman


You need to create a NSBitmapImageRep and then save that, then read the NSData to UIImage with +[UIImage imageWithData:]:

First in OS X, save the data:

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

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

You could also use imageRepWithData: if you have NSData of the image already - the above will load it from a file (like you can also do with NSImage).

Then in iOS:

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

See here for the other allowed keys for the dictionary in representationUsingType:properties:.

like image 32
Rich Avatar answered Oct 20 '22 12:10

Rich