convert UIImage to NSData

175,075

Solution 1

Try one of the following, depending on your image format:

UIImageJPEGRepresentation

Returns the data for the specified image in JPEG format.

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

Returns the data for the specified image in PNG format

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Here the docs.

EDIT:

if you want to access the raw bytes that make up the UIImage, you could use this approach:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

This will give you the low-level representation of the image RGB pixels. (Omit the CFBridgingRelease bit if you are not using ARC).

Solution 2

NSData *imageData = UIImagePNGRepresentation(myImage.image);

Solution 3

If you have an image inside a UIImageView , e.g. "myImageView", you can do the following:

Convert your image using UIImageJPEGRepresentation() or UIImagePNGRepresentation() like this:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

You can also put this code inside a GCD block and execute in another thread, showing an UIActivityIndicatorView during the process ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

Solution 4

Create the reference of image....

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

displaying image in image view... imagedisplay is reference of imageview:

imagedisplay.image = rainyImage;

convert it into NSData by passing UIImage reference and provide compression quality in float values:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

Solution 5

Solution in Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
Share:
175,075

Related videos on Youtube

Vipin
Author by

Vipin

Updated on May 11, 2020

Comments

  • Vipin
    Vipin almost 4 years

    I am using this code in my app which will help me to send a image.

    However, I have an image view with an image. I have no file in appbundle but have the image in my side. How can I change the below code ? Can anyone tell me how can I convert myimage to NSData ?

    // Attach an image to the email
    NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
    NSData *myData = [NSData dataWithContentsOfFile:path];
    [picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];
    
    • Himanshu Agnihotri
      Himanshu Agnihotri over 11 years
      UIImageJPEGRepresentation,UIImagePNGRepresentation both return nsdata of the image.....
  • user2128531
    user2128531 about 11 years
    I am using this line but this is very slow
  • devios1
    devios1 over 10 years
    Is there a way to just get the data in whatever format it is already in?
  • mostruash
    mostruash over 10 years
    Xcode suggests me to use (id)CFBridgingRelease(CGDataProviderCopyData(provider)) to take the ownership of CDataRef returned by CGDataProviderCopyData in ARC.
  • sergio
    sergio over 10 years
    @mostruash: thanks, I have modified my answer to take into account your suggestion.
  • mostruash
    mostruash over 10 years
    @sergio I'm not experienced with non-ARC Obj-C and I wonder if releasing data would be enough or if there would still be a memory leak.
  • sergio
    sergio over 10 years
    @mostruash: in non-ARC case, there is no concept of ownership; the programmer should ensure that each object be released for any retain it received. In the present case, by releasing data you would ensure the object is properly deallocated: CGDataProviderCopyData gives you a retain count of 1; be releasing the object, you make it to be dealloc-ed.
  • mostruash
    mostruash over 10 years
    @sergio Thanks for the clarification.
  • Yony
    Yony over 9 years
    Note that imageFlags (like imageOrientation) get lost when using UIImagePNGRepresentation. That's why UIImageJPEGRepresentation is preferred.
  • Yony
    Yony over 9 years
    Note that imageFlags (like imageOrientation) get lost when using UIImagePNGRepresentation. That's why UIImageJPEGRepresentation is preferred
  • hbk
    hbk over 9 years
    awesome! save ton of time (last approach)
  • King-Wizard
    King-Wizard about 9 years
    This won't help. The property CIImage is only set if it was initialized with imageWithCIImage:. Also this isn't directly the used data but rather another image representation object.
  • Manuel
    Manuel over 6 years
    How is the cgImage.dataProvider data encoded? It seems to be different from the data of UIImagePNGRepresentation and UIImageJPEGRepresentation because it cannot be used to create an image like so UIImage(data: imageData).
  • Charlton Provatas
    Charlton Provatas over 6 years
    @Manuel Not sure. I just converted the syntax from Sergio 's answer. Sergio would probably know better.
  • Charlton Provatas
    Charlton Provatas over 6 years
    @Manuel I'm assuming because it's using CoreGraphics API it's giving a lower-level data representation of the image than what UIImageJPEGRepresentation provides. But I believe this solution preserves the original encoding format that the image was in and doesn't re-encode it.