convert UIImage to NSData
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
);
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?
}
}
Related videos on Youtube
Vipin
Updated on May 11, 2020Comments
-
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
toNSData
?// 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 over 11 yearsUIImageJPEGRepresentation,UIImagePNGRepresentation both return nsdata of the image.....
-
-
user2128531 about 11 yearsI am using this line but this is very slow
-
devios1 over 10 yearsIs there a way to just get the data in whatever format it is already in?
-
mostruash over 10 yearsXcode suggests me to use
(id)CFBridgingRelease(CGDataProviderCopyData(provider))
to take the ownership ofCDataRef
returned byCGDataProviderCopyData
in ARC. -
sergio over 10 years@mostruash: thanks, I have modified my answer to take into account your suggestion.
-
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 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 of1
; be releasing the object, you make it to be dealloc-ed. -
mostruash over 10 years@sergio Thanks for the clarification.
-
Yony over 9 yearsNote that imageFlags (like imageOrientation) get lost when using UIImagePNGRepresentation. That's why UIImageJPEGRepresentation is preferred.
-
Yony over 9 yearsNote that imageFlags (like imageOrientation) get lost when using UIImagePNGRepresentation. That's why UIImageJPEGRepresentation is preferred
-
hbk over 9 yearsawesome! save ton of time (last approach)
-
King-Wizard about 9 yearsThis 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 over 6 yearsHow is the
cgImage.dataProvider
data encoded? It seems to be different from the data ofUIImagePNGRepresentation
andUIImageJPEGRepresentation
because it cannot be used to create an image like soUIImage(data: imageData)
. -
Charlton Provatas over 6 years@Manuel Not sure. I just converted the syntax from Sergio 's answer. Sergio would probably know better.
-
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.