9

I have to populate table cell from database and images are on device. I've to store that image in imageDataObject, how to convert that UIImage to NSData. Please suggest, I tried many solution but it's not converting back that NSData to UIImage.

    cell.textLabel.text = [[offlineImageListArray objectAtIndex:indexPath.row] imageName];
    UIImage *thumbnail = [self retrieveImageFromDevice:[[offlineImageListArray objectAtIndex:indexPath.row] imageName]];
    NSData* data = ??????????;
    ImageData *imageDataObject = [[ImageData alloc] initWithImageId:[[offlineImageListArray objectAtIndex:indexPath.row]imageId] 
    imageName:[[offlineImageListArray objectAtIndex:indexPath.row] imageName] imageData:data];
    [imagesArray addObject:imageDataObject];
Akshit Zaveri
  • 4,166
  • 6
  • 30
  • 59
user2769614
  • 247
  • 3
  • 6
  • 23
  • possible duplicate of [convert UIImage to NSData](http://stackoverflow.com/questions/6476929/convert-uiimage-to-nsdata) – CRDave Nov 16 '13 at 05:33
  • possible duplicate of [How to convert NSData value to UIImage](http://stackoverflow.com/questions/10101526/how-to-convert-nsdata-value-to-uiimage) – Akshit Zaveri Nov 16 '13 at 06:03
  • possible duplicate of [NSData to UIImage](http://stackoverflow.com/questions/2240765/nsdata-to-uiimage) – Undo Dec 31 '13 at 15:04

5 Answers5

18

To convert UIImage to NSData, use either UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality) or UIImagePNGRepresentation(UIImage *image)

To convert NSData to UIImage, use [UIImage imageWithData:imageData]

So your example could look like this:

cell.textLabel.text = [[offlineImageListArray objectAtIndex:indexPath.row] imageName];
UIImage *thumbnail = [self retrieveImageFromDevice:[[offlineImageListArray objectAtIndex:indexPath.row] imageName]];
NSData* data = UIImagePNGRepresentation(thumbnail);
ImageData *imageDataObject = [[ImageData alloc] initWithImageId:[[offlineImageListArray objectAtIndex:indexPath.row]imageId] imageName:[[offlineImageListArray objectAtIndex:indexPath.row] imageName] imageData:data];
[imagesArray addObject:imageDataObject];

References: https://developer.apple.com/LIBRARY/IOS/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html

James Glenn
  • 308
  • 2
  • 8
9

Try With this:

Use this for convert UIImage to NSData.

  NSData *imagedata = UIImagePNGRepresentation(thumbnail);

Try this for image data convert back to UIImage

  UIImage *image= [UIImage imageWithData:imagedata];
Akshit Zaveri
  • 4,166
  • 6
  • 30
  • 59
Pradhyuman sinh
  • 3,936
  • 1
  • 23
  • 38
4

in Swift version:

    let imageData = image!.pngData()
    let imageFromData = UIImage(data: imageData)

See: https://developer.apple.com/documentation/uikit/uiimage/1624096-pngdata

Bilal Arslan
  • 307
  • 3
  • 10
0

Use if-let block with Data to prevent app crash & safe execution of code, as function UIImagePNGRepresentation returns an optional value.

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

Note: Data is Swift 3 class. Use Data instead of NSData with Swift 3

Generic image operations (like png & jpg both):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

By using extension:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}
Krunal
  • 77,632
  • 48
  • 245
  • 261
0

Convert Data from Image:

Try JPEG or PNG representation 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
);

Example:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

Use:

let data = myImage.jpegRepresentationData
let data1 = myImage.pngRepresentationData

Convert Image from Data:

let image = UIImage(data: data)
Vicky Prajapati
  • 137
  • 1
  • 5