Réponses:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
ou
NSData *imageData = UIImagePNGRepresentation(image);
Selon si vous souhaitez que vos données soient au format PNG ou JPG.
Lors de l'initialisation d'un UIImage
objet avec init(data: originalData)
, cela originalData
sera converti en données brutes dans une sorte de format interne. Ces données peuvent être récupérées ultérieurement avec
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Cependant, comme il rawData
est brut, il sera encore plus gros que lors de l'utilisation UIImagePNGRepresentation
.
Vous pouvez vous attendre à ce qu'une UIImage soit un objet formaté pour l'affichage et n'utilisera donc pas les données d'origine (qui sont probablement au format PNG ou JPEG) mais plus probablement un tableau de pixels ou un autre format interne. En d'autres termes, UIImage(data: foo)
ne retiendra pas foo
.
Si vous souhaitez simplement l'utiliser ailleurs dans votre programme, l'UIImage d'origine fera l'affaire (je suppose que ce n'est pas le cas ici)
Si vous souhaitez sérialiser, UIImagePNGRepresentation(...)
fonctionnera mais sera surdimensionné si l'original était un JPEG; UIImageJPEGRepresentation(...)
entraînera souvent des données légèrement surdimensionnées et est légèrement avec perte si votre original était PNG. Vous devriez en choisir un en fonction de la façon dont l'image sera affichée et du format que vous prévoyez de fournir. Si vous utilisez PNG et que vous voulez que PNG sort, vous devriez obtenir une bonne taille de fichier et des données presque identiques, à part les morceaux PNG spéciaux.
Si vous souhaitez obtenir une copie exacte des données d'origine (peut-être pour enregistrer un fichier après la vignette ou pour le SHA1), vous devez le conserver séparément. Vous pourriez faire quelque chose comme:
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)
Les choses ont changé depuis que la réponse ci-dessus a été donnée, pour ceux qui cherchent toujours parce qu'ils partagent la préoccupation de CipherCom: iOS 5 a ajouté la propriété CIImage .
CIImage
n'est définie que si elle a été initialisée avec imageWithCIImage:
. De plus, ce ne sont pas directement les données utilisées mais plutôt un autre objet de représentation d'image.
UIImageJPEGRepresentation
ouUIImagePNGRepresentation
va modifier les données et faire un reconversions. Existe-t-il un moyen de vraiment réaliser ce qui a été demandé?