convertir UIImage en NSData


Estoy usando este código en mi aplicación que me ayudará a enviar una imagen.

Sin embargo, tengo una vista de imagen con una imagen. No tengo ningún archivo en appbundle pero tengo la imagen en mi lado. ¿Cómo puedo cambiar el siguiente código ? ¿Puede alguien decirme cómo puedo convertir myimage a 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"];
Author: Super Chafouin, 2011-06-25

7 answers

Pruebe uno de los siguientes, dependiendo del formato de imagen:

UIImageJPEGRepresentación

Devuelve los datos de la imagen especificada en formato JPEG.

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

UIImagePNGRepresentación

Devuelve los datos de la imagen especificada en formato PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Aquí los docs .

EDITAR:

Si quieres acceder a los bytes raw que componen la UIImage, puedes usar esto enfoque:

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

Esto le dará la representación de bajo nivel de los píxeles RGB de la imagen. (Omita el bit CFBridgingRelease si no está utilizando ARC).

 285
Author: sergio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 14:51:34
NSData *imageData = UIImagePNGRepresentation(myImage.image);
 157
Author: Radix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 06:14:46

Si tiene una imagen dentro de un UIImageView, por ejemplo, "myImageView", puede hacer lo siguiente:

Convierte tu imagen usando UIImageJPEGRepresentation() o UIImagePNGRepresentation () así:

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).

También puede poner este código dentro de un bloque GCD y ejecutarlo en otro subproceso, mostrando un UIActivityIndicatorView durante el proceso ...

//*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*
    });
});
 25
Author: FormigaNinja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-01 05:12:06

Crear la referencia de la imagen....

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

Mostrando la imagen en la vista de imagen... imagedisplay es la referencia de imageview:

imagedisplay.image = rainyImage;

Conviértalo en NSData pasando UIImage referencia y proporcione calidad de compresión en valores flotantes:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
 24
Author: Jemythehigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-09 14:52:38

Solución en Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
 2
Author: Charlton Provatas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-15 14:53:11

Use if-let block con datos para evitar el bloqueo de la aplicación y la ejecución segura del código, ya que la función UIImagePNGRepresentation devuelve un valor opcional.

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

Nota: Data es clase Swift 3. Utilizar datos en lugar de NSData con Swift 3

Operaciones de imagen genéricas (como png y jpg):

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...
     }
}

Usando la extensión:

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...
     }
}
 1
Author: Krunal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 08:50:06
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
 0
Author: jayesh mardiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-10 07:29:29