Risposte:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
o
NSData *imageData = UIImagePNGRepresentation(image);
A seconda che tu voglia i tuoi dati in formato PNG o JPG.
Quando si inizializza un UIImage
oggetto con init(data: originalData)
, questo originalData
verrà convertito in dati grezzi in una sorta di formato interno. Questi dati possono essere recuperati in seguito con
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Tuttavia, poiché rawData
è grezzo, sarà ancora più grande di quando si utilizza UIImagePNGRepresentation
.
Puoi aspettarti che un UIImage sia un oggetto formattato per la visualizzazione e quindi non utilizzerà i dati originali (che sono probabilmente in formato PNG o JPEG) ma più probabilmente un array di pixel o qualche altro formato interno. In altre parole, UIImage(data: foo)
non manterrà foo
.
Se vuoi solo usarlo altrove nel tuo programma, l'originale UIImage andrà bene (presumo che non sia effettivamente il caso qui)
Se vuoi serializzare, UIImagePNGRepresentation(...)
funzionerà ma sarà sovradimensionato se l'originale era un JPEG; UIImageJPEGRepresentation(...)
spesso si tradurrà in dati leggermente sovradimensionati ed è leggermente con perdita se l'originale era PNG. Dovrebbe essere corretto sceglierne uno in base al modo in cui l'immagine verrà visualizzata e al formato che ci si aspetta venga fornito. Se ti capita di utilizzare PNG in e vuoi PNG fuori, dovresti ottenere una buona dimensione del file e dati quasi identici, blocchi PNG speciali a parte.
Se si desidera ottenere una copia esatta dei dati originali (magari per salvare un file dopo l'anteprima o per SHA1), è necessario conservarlo separatamente. Potresti fare qualcosa come:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
Swift 4.2
let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
Le cose sono cambiate da quando è stata data la risposta di cui sopra, per coloro che stanno ancora cercando perché condividono la preoccupazione di CipherCom: iOS 5 ha aggiunto la proprietà CIImage .
CIImage
viene impostata solo se è stata inizializzata con imageWithCIImage:
. Inoltre questo non è direttamente i dati utilizzati ma piuttosto un altro oggetto di rappresentazione dell'immagine.
UIImageJPEGRepresentation
oUIImagePNGRepresentation
si altera i dati e fare una riconversione. C'è un modo per ottenere davvero ciò che è stato chiesto?