converti UIImage in NSData


170

Sto usando questo codice nella mia app che mi aiuterà a inviare un'immagine.

Tuttavia, ho una vista immagine con un'immagine. Non ho file in appbundle ma ho l'immagine al mio fianco. Come posso cambiare il codice qui sotto? Qualcuno può dirmi come posso convertire myimagein 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"];

2
UIImageJPEGRepresentation, UIImagePNGRepresentation restituiscono entrambi nsdata dell'immagine .....
Himanshu Agnihotri

Risposte:


286

Prova una delle seguenti, a seconda del formato dell'immagine:

UIImageJPEGRepresentation

Restituisce i dati per l'immagine specificata in formato JPEG.

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

UIImagePNGRepresentation

Restituisce i dati per l'immagine specificata in formato PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Ecco i documenti .

MODIFICARE:

se si desidera accedere ai byte non elaborati che compongono il UIImage, è possibile utilizzare questo approccio:

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

Questo ti darà la rappresentazione di basso livello dei pixel RGB dell'immagine. (Omettere il CFBridgingReleasebit se non si utilizza ARC).


8
C'è un modo per ottenere i dati in qualunque formato siano già in?
devios1

1
Xcode mi suggerisce di utilizzare (id)CFBridgingRelease(CGDataProviderCopyData(provider))per assumere la proprietà di CDataRefrestituito da CGDataProviderCopyDataARC.
mostruash,

1
@mostruash: grazie, ho modificato la mia risposta per tenere conto del tuo suggerimento.
sergio,

@sergio Non ho esperienza con Ob-C non-ARC e mi chiedo se il rilascio datasarebbe sufficiente o se ci fosse ancora una perdita di memoria.
mostruash,

1
Questo non aiuta. La proprietà CIImage è impostata solo se è stata inizializzata con imageWithCIImage :. Inoltre, non si tratta direttamente dei dati utilizzati, ma piuttosto di un altro oggetto di rappresentazione dell'immagine.
Re-mago

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
Sto usando questa linea ma è molto lenta
user2128531

5
Si noti che imageFlags (come imageOrientation) si perde quando si utilizza UIImagePNGRepresentation. Ecco perché si preferisce la rappresentazione UIImageJPEG.
Yony

26

Se hai un'immagine all'interno di UIImageView, ad esempio "myImageView", puoi fare quanto segue:

Converti la tua immagine usando UIImageJPEGRepresentation () o UIImagePNGRepresentation () in questo modo:

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

Puoi anche inserire questo codice all'interno di un blocco GCD ed eseguire in un altro thread, mostrando un UIActivityIndicatorView durante il processo ...

//*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*
    });
});

24

Crea il riferimento dell'immagine ....

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

visualizzazione dell'immagine in visualizzazione immagine ... imagedisplay è riferimento di imageview:

imagedisplay.image = rainyImage;

convertirlo in NSDatapassando il UIImageriferimento e fornire la qualità di compressione in valori float:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

Soluzione in Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

Come cgImage.dataProvidervengono codificati i dati? Sembra essere diverso dai dati di UIImagePNGRepresentatione UIImageJPEGRepresentationperché non può essere utilizzato per creare un'immagine in questo modo UIImage(data: imageData).
Manuel,

@Manuel Non ne sono sicuro. Ho appena convertito la sintassi dalla risposta di Sergio. Sergio probabilmente lo saprebbe meglio.
Charlton Provatas,

@Manuel Sto assumendo perché sta usando l'API CoreGraphics che sta fornendo una rappresentazione dei dati di livello inferiore dell'immagine rispetto a quella UIImageJPEGRepresentationfornita. Ma credo che questa soluzione preservi il formato di codifica originale in cui si trovava l'immagine e non la ricodificherà.
Charlton Provatas,

1

Usa il blocco if-let con Data per impedire l'arresto anomalo dell'app e l'esecuzione sicura del codice, poiché la funzione UIImagePNGRepresentation restituisce un valore facoltativo.

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

Nota: i dati sono di classe Swift 3. Usa i dati anziché NSData con Swift 3

Operazioni generiche con le immagini (come png e 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...
     }
}

Utilizzando l'estensione:

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

0
- (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];
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.