convertir UIImage en NSData

J'utilise ce code dans mon application qui m'aidera à envoyer une image.

Cependant, j'ai une vue d'image avec une image. Je n'ai aucun fichier dans appbundle mais l'image de mon côté. Comment puis-je changer le code ci-dessous ? Quelqu'un peut me dire comment puis-je convertir myimage à 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"];
167
demandé sur Super Chafouin 2011-06-25 13:20:35

7 réponses

Essayez l'une des options suivantes, en fonction du format de votre image:

UIImageJPEGRepresentation

Renvoie les données de l'image spécifiée au format JPEG.

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

UIImagePNGRepresentation

Renvoie les données de l'image spécifiée au format PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Voici les docs.

Modifier:

Si vous voulez accéder aux octets bruts qui composent L'UIImage, vous pouvez utiliser ceci approche:

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

Cela vous donnera la représentation de bas niveau des pixels RVB de l'image. (Omettez le bit CFBridgingRelease Si vous n'utilisez pas ARC).

285
répondu sergio 2014-01-17 14:51:34
NSData *imageData = UIImagePNGRepresentation(myImage.image);
157
répondu Radix 2013-02-27 06:14:46

Si vous avez une image dans un UIImageView, par exemple "myImageView" , vous pouvez faire ce qui suit:

Convertissez votre image en utilisant UIImageJPEGRepresentation () ou UIImagePNGRepresentation() comme ceci:

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

Vous pouvez également placer ce code dans un bloc GCD et l'exécuter dans un autre thread, montrant un UIActivityIndicatorView pendant le processus ...

//*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
répondu FormigaNinja 2017-05-01 05:12:06

Crée la référence de l'image....

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

Affichage de l'image dans la vue image... imagedisplay {[9] } est la référence de imageview:

imagedisplay.image = rainyImage;

Convertissez-le en NSData en passant la référence UIImage et fournissez une qualité de compression dans les valeurs flottantes:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
24
répondu Jemythehigh 2016-06-09 14:52:38

Solution rapide 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
2
répondu Charlton Provatas 2017-07-15 14:53:11

Utilisez le bloc if-let avec des données pour empêcher le crash de l'application et l'exécution sûre du code, car la fonction UIImagePNGRepresentation renvoie une valeur facultative.

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

Remarque: Data est la classe Swift 3. Utilisez Data au lieu de NSData avec Swift 3

Opérations D'image génériques (comme png et jpg les deux):

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

En utilisant l'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...
     }
}
1
répondu Krunal 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
répondu jayesh mardiya 2015-12-10 07:29:29