web-dev-qa-db-fra.com

Obtenez le NSData sous-jacent de UIImage

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];

97
eugene
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.

185
Caroline

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.

17
yesleon

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.

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

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

  3. 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)
        }
    }
    
6
Jim Driscoll

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) 
4
nsij22

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)
2
maslovsa