Convierta UIImage a NSData sin usar UIImagePngrepresentation o UIImageJpegRepresentation

Necesito convertir UIImage a NSData pero sin usar UIImagePngRepresentation o UIImageJpegRepresentation , para las imágenes de photolib puedo usar el método assetlib como se menciona aquí. Utilizando ALAssetsLibrary y ALAsset sacando Image como NSData , pero para la image capturada, assset url no está ahí, por lo tanto, en ese caso Necesito convertir UIImage directamente a bytes con datos exif, ¿cómo puedo lograr esto? por favor ayuda

    H Bastan,

    Según tu comentario:

    … Quiero save el retorno de la image capturada por la camera del dispositivo, a través del método de delegado UIImagepicker en el directory del documento …

    Parece que su objective real es save la image con datos EXIF ​​en el directory de documentos y no get específicamente el UIImage como un object NSData con los datos EXIF. En ese caso, puede hacer lo siguiente en su implementación de imagePickerController:didFinishPickingMediaWithInfo:

     // Get your image. UIImage *captunetworkingImage = [info objectForKey:UIImagePickerControllerOriginalImage]; // Get your metadata (includes the EXIF data). NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata]; // Create your file URL. NSFileManager *defaultManager = [NSFileManager defaultManager]; NSURL *docsURL = [[defaultManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL *outputURL = [docsURL URLByAppendingPathComponent:@"imageWithEXIFData.jpg"]; // Set your compression quuality (0.0 to 1.0). NSMutableDictionary *mutableMetadata = [metadata mutableCopy]; [mutableMetadata setObject:@(1.0) forKey:(__bridge NSString *)kCGImageDestinationLossyCompressionQuality]; // Create an image destination. CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL((__bridge CFURLRef)outputURL, kUTTypeJPEG , 1, NULL); if (imageDestination == NULL ) { // Handle failure. NSLog(@"Error -> failed to create image destination."); return; } // Add your image to the destination. CGImageDestinationAddImage(imageDestination, captunetworkingImage.CGImage, (__bridge CFDictionaryRef)mutableMetadata); // Finalize the destination. if (CGImageDestinationFinalize(imageDestination) == NO) { // Handle failure. NSLog(@"Error -> failed to finalize the image."); } CFRelease(imageDestination); 

    De mis testings, el time de ejecución fue aproximadamente igual o más rápido que hacer:

     NSData *data = UIImageJPEGRepresentation(captunetworkingImage, 1.0); [data writeToURL:outputURL atomically:YES]; 

    … ¡Y puedes conservar los datos EXIF!

    También puede enviarlo a una queue de background si desea asegurarse de que su interfaz de usuario permanezca receptiva:

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Do the image saving here... }); 

    Nota importante: necesitará agregar ImageIO.framework y MobileCoreServices.framework a las fases de compilation de su objective e importarlas en la class donde guarda el almacenamiento de imágenes:

     #import <ImageIO/ImageIO.h> #import <MobileCoreServices/MobileCoreServices.h> 

    Otras notas Entiendo que en este caso no estamos creando una pérdida de generación al save la image como se propone en el ejemplo. Estamos utilizando la propiedad CGImage de UIImage y como lo indica la documentation:

    Los datos de image de cuarzo subyacentes

    Tuve un problema similar, pero por razones de security no quería escribir los datos en el sistema de files pnetworkingeterminado como lo sugiere Wes. También quería poder agregar metadatos a mi image. Mi solución fue la siguiente:

     - (NSData *)dataFromImage:(UIImage *)image metadata:(NSDictionary *)metadata mimetype:(NSString *)mimetype { NSMutableData *imageData = [NSMutableData data]; CFStringRef uti = UTTypeCreatePrefernetworkingIdentifierForTag(kUTTagClassMIMEType, (__bridge CFStringRef)mimetype, NULL); CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, uti, 1, NULL); if (imageDestination == NULL) { NSLog(@"Failed to create image destination"); imageData = nil; } else { CGImageDestinationAddImage(imageDestination, image.CGImage, (__bridge CFDictionaryRef)metadata); if (CGImageDestinationFinalize(imageDestination) == NO) { NSLog(@"Failed to finalise"); imageData = nil; } CFRelease(imageDestination); } CFRelease(uti); return imageData; } 

    Para usarlo, haría lo siguiente:

     - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata]; NSString *mimeType = @"image/jpeg"; // ideally this would be dynamically set. Not defaulted to a jpeg! // you could add to the metadata dictionary (after converting it to a mutable copy) if you needed to. // convert to NSData NSData *imageData = [self dataFromImage:image metadata:metadata mimetype:mimeType]; // ... } 

    Puedes probar algo como esto. No estoy seguro si es el mejor método. Pero vale la pena. En caso de que la URL de la image esté disponible, puede probar initWithContentsOfUrl

     NSData *data = [[NSData alloc]initWithContentsOfFile:@"/Users/test/isajf/isajf/test.jpg"];