Je peux créer UIImage
à partir de NSData
en utilisant [UIImage imageWithData:]
ou [UIImage initWithData:]
méthodes.
Je me demande si je peux récupérer le NSData
d'un UIImage
existant? Quelque chose sur la ligne de NSData *myData = [myImage getData];
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
ou
NSData *imageData = UIImagePNGRepresentation(image);
Selon que vous voulez que vos données soient au format PNG ou JPG.
Lors de l'initialisation d'un objet UIImage
avec init(data: originalData)
, ce originalData
sera converti en données brutes dans un type de format interne. Ces données peuvent être récupérées plus tard avec
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Cependant, étant donné que le rawData
est brut, il sera encore plus grand que lorsque vous utilisez UIImagePNGRepresentation
.
Vous pouvez vous attendre à ce qu'un UIImage soit un objet formaté pour l'affichage et n'utilisera donc pas les données d'origine (probablement au format PNG ou JPEG), mais plutôt un tableau de pixels ou un autre format interne. En d'autres termes, UIImage(data: foo)
ne conservera pas foo
.
Si vous voulez simplement l'utiliser ailleurs dans votre programme, la version originale de UIImage 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 fichier JPEG; UIImageJPEGRepresentation(...)
entraînera souvent des données légèrement surdimensionnées et entraînera une légère perte si votre original était au format PNG. Il devrait être correct d'en choisir un en fonction de la manière dont l'image sera affichée et du format que vous vous attendez à fournir. Si vous utilisez le format PNG et que vous souhaitez le supprimer, vous devriez obtenir une bonne taille de fichier et des données presque identiques, à part des morceaux spéciaux PNG.
Si vous souhaitez obtenir une copie exacte des données d'origine (par exemple, pour enregistrer un fichier après sa création, 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)
}
}
Juste parce que je suis tombé sur ça et que j'aime bien Swift :)
Voici la traduction Swift du message de Caroiline).
var imageData = UIImagePNGRepresentation(image)
Ou
var imageData = UIImageJPEGRepresentation(image, 0.7)
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)