Get underlying NSData from UIImage

Cocoa TouchUiimageNsdata

Cocoa Touch Problem Overview


I can create UIImage from NSData using [UIImage imageWithData:] or [UIImage initWithData:] methods.

I wonder if I can get the NSData back from an existing UIImage? Something on the line of NSData *myData = [myImage getData];

Cocoa Touch Solutions


Solution 1 - Cocoa Touch

NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality

or

NSData *imageData = UIImagePNGRepresentation(image);

Depending if you want your data in PNG format or JPG format.

Solution 2 - Cocoa Touch

When initialising a UIImage object with init(data: originalData), that originalData will be converted into raw data in some kind of internal format. These data can be retrieved later with

let rawData = myImage.cgImage?.dataProvider?.data as Data?

However because the rawData is raw, it is going to be even larger than when using UIImagePNGRepresentation.

Solution 3 - Cocoa Touch

Swift 4.2

let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format

let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

Solution 4 - Cocoa Touch

Just because I stumbled upon this and i like swift :)

Here is the swift translation of Caroiline's post.

var imageData = UIImagePNGRepresentation(image)

Or

var imageData = UIImageJPEGRepresentation(image, 0.7) 

Solution 5 - Cocoa Touch

You can expect that a UIImage is an object formatted for display and so won't be using the original data (which is probably in PNG or JPEG format) but more likely a pixel array or some other internal format. In other words, UIImage(data: foo) will not retain foo.

  1. If you just want to use it elsewhere in your program, the original UIImage will do fine (I presume that's not actually the case here)

  2. If you want to serialise, UIImagePNGRepresentation(...) will work but will be oversized if the original was a JPEG; UIImageJPEGRepresentation(...) will often result in slightly oversize data and is slightly lossy if your original was PNG. It should be okay to pick one based on the way the image will be displayed and the format you expect to be provided. If you happen to be using PNG in and want PNG out, you should get a good file size and almost identical data, special PNG chunks aside.

  3. If you want to get an exact copy of the original data (perhaps to save a file after thumbnailing, or to SHA1 it), then you need to retain it separately. You might do something like:

     var image:UIImage
     var imageData:NSData {
         didSet {
             image = UIImage(data: imageData)
         }
     }
    

Solution 6 - Cocoa Touch

The only solution I found to serialize/unserialize a UIImage (via Data) is by using this solution.

You can then serialize/unserialize regardless of how the UIImage was created by using the extension method on UIImage:

let originalImage: UIImage = ...
let cgData = image.cgImage!.png!
let image = UIImage(data: cgData)!

Solution 7 - Cocoa Touch

Things have changed since the above answer was given, for those still looking because they share CipherCom's concern: iOS 5 has added the CIImage property.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioneugeneView Question on Stackoverflow
Solution 1 - Cocoa TouchCarolineView Answer on Stackoverflow
Solution 2 - Cocoa TouchyesleonView Answer on Stackoverflow
Solution 3 - Cocoa TouchmaslovsaView Answer on Stackoverflow
Solution 4 - Cocoa Touchnsij22View Answer on Stackoverflow
Solution 5 - Cocoa TouchJim DriscollView Answer on Stackoverflow
Solution 6 - Cocoa TouchSensefulView Answer on Stackoverflow
Solution 7 - Cocoa TouchRafeView Answer on Stackoverflow