Lorsque j'utilise UIImagePNGRepresentation ou UIImageJPEGRepresentation pour convertir UIImage en NSdata, la taille de l'image est trop grande

Lorsque j'utilise UIImagePNGRepresentation ou UIImageJPEGRepresentation pour convertir UIImage en NSdata, la taille de l'image est trop augmentée.

Étapes à reproduire:

1) Ouvrir Xcode et sélectionner un nouveau projet en tant qu'application basée sur une vue unique

2) Ouvrez ViewController.xib et ajoutez deux buttons nommés comme i) Tester l'image en ligne ii) Tester l'image locale

3) Ajouter deux IBActions

i) -(IBAction)ClickLocalImageTest:(id)sender; ii) -(IBAction)ClickOnLineImageTest:(id)sender; 

4) Connectez "Test Online Image" à " -(IBAction)ClickOnLineImageTest:(id)sender "

et "Test de l'image locale" à " -(IBAction)ClickLocalImageTest:(id)sender ;"

5) empalement " -(IBAction)ClickLocalImageTest:(id)sender " méthode comme suivant

 - (IBAction)ClickLocalImageTest:(id)sender { NSLog(@"*************Test Local Image****************\n"); NSSsortingng *path=[[NSBundle mainBundle] pathForResource:@"hero_ipad_retina" ofType:@"jpg"]; NSLog(@"Before testing image size is :<---- %u kb",[[NSData dataWithContentsOfFile:path] length]/1024); UIImage *img = [UIImage imageNamed:@"hero_ipad_retina.jpg"]; NSLog(@"UIImagePNGRepresentation: image size is---->: %u kb",[UIImagePNGRepresentation(img) length]/1024); NSLog(@"UIImageJPEGRepresentation with scale 1.0: image size is---->: %u kb \n",[UIImageJPEGRepresentation(img, 1.0) length]/1024); NSLog(@"*************Completed test****************\n\n\n\n"); } 

6) empalement " - (IBAction)ClickOnLineImageTest:(id)sender " méthode comme suit

 - (IBAction)ClickOnLineImageTest:(id)sender { NSLog(@"*************Test Online Image****************\n"); NSLog(@"Before testing image size is :<---- %u kb",[[NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:@"http://images.apple.com/home/images/hero_ipad_retina.jpg"]] length]/1024); UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:@"http://images.apple.com/home/images/hero_ipad_retina.jpg"]]]; NSLog(@"UIImagePNGRepresentation: image size is---->: %u kb",[UIImagePNGRepresentation(img) length]/1024); NSLog(@"UIImageJPEGRepresentation with scale 1.0: image size is---->: %u kb \n",[UIImageJPEGRepresentation(img, 1.0) length]/1024); NSLog(@"*************Completed test****************\n\n\n\n"); } 

7) S'il vous plaît download "hero_ipad_retina.jpg" image d' ici et save dans vos ressources nommées comme "hero_ipad_retina.jpg"

7) Maintenant, exécutez ce projet sur Xcode 4.0 plus tard et IOS3.0 ci-dessus SDK

**

 Expected Results: 1)Click on "Test Online Image" button result should be as following *************Test Online Image**************** Before testing image size is :<---- 78 kb UIImagePNGRepresentation: image size is---->: 78 kb UIImageJPEGRepresentation with scale 1.0: image size is---->: 78 kb *************Completed test**************** 2)1)Click on "Test Local image" button result should be as following *************Test Local Image**************** Before testing image size is :<---- 78 kb UIImagePNGRepresentation: image size is---->: 78 kb UIImageJPEGRepresentation with scale 1.0: image size is---->: 78 kb *************Completed test**************** Actual Results: 1)Click on "Test Online Image" button result should be as following *************Test Online Image**************** Before testing image size is :<---- 78 kb UIImagePNGRepresentation: image size is---->: 480 kb UIImageJPEGRepresentation with scale 1.0: image size is---->: 180 kb *************Completed test**************** 2)1)Click on "Test Local image" button result should be as following *************Test Local Image**************** Before testing image size is :<---- 78 kb UIImagePNGRepresentation: image size is---->: 480 kb UIImageJPEGRepresentation with scale 1.0: image size is---->: 180 kb *************Completed test****************** 

Ma question :

pourquoi il augmente sa taille? et quelle est la façon optimisée de convertir l'image en NSData?

Notes: S'il vous plaît download "hero_ipad_retina.jpg" image d' ici et économisez dans vos ressources

"hero_ipad_retina.jpg" est une image jpg compressée

Cette ligne:

 [[NSData dataWithContentsOfFile:path] length]/1024 

donne sa taille de file compressé …

Cette ligne:

 [UIImagePNGRepresentation(img) length]/1024 

Décompresse l'image et la convertit en PNG, un format de file sans perte . Sa taille est inévitablement beaucoup plus grande.

Cette ligne:

 [UIImageJPEGRepresentation(img, 1.0) length]/1024 

décompresse l'image et la recompresse en une représentation JPG. Vous avez réglé la qualité au maximum (1.0) donc – par rapport à l'original qui était sans doute compressé à une qualité inférieure – vous obtenez une taille de file plus grande. Si vous définissez la qualité sur 0.5, vous obtiendrez une petite taille de file (environ 42K)

C'est un excellent callback de la raison pour laquelle vous devriez traiter les images JPEG avec prudence. Chaque fois que vous accédez à un file imageRep jpeg, vous êtes décompressé. Si vous recomposez ensuite, même en qualité maximale, vous réduisez la qualité de l'image (car chaque compression avec perte est pire que la précédente). Les artefacts augmentent et deviennent particulièrement visibles avec les images charts (colors plates, bords droits / contrastés). Le format PNG est toujours plus sûr – il est sans perte en 24 bits, et en 8 bits, il traite les zones de couleur plate.

mettre à jour

Pour get la taille d'une image en memory:

 NSUInteger sizeInBytes = CGImageGetHeight(image.CGImage) * CGImageGetBytesPerRow(image.CGImage); 

A partir de là, vous pouvez calculer les taux de compression pour PNG, JPG et le file original (divisez par 1024 pour les kilo-octets pour get les ratios corrects avec les numbers ci-dessus).