76 votes

Comment compresser/redimensionner une image sur iOS avant de la télécharger sur un serveur ?

Je télécharge actuellement une image vers un serveur en utilisant Imgur sur iOS avec le code suivant :

NSData* imageData = UIImagePNGRepresentation(image);
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* fullPathToFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"SBTempImage.png"];
[imageData writeToFile:fullPathToFile atomically:NO];

[uploadRequest setFile:fullPathToFile forKey:@"image"];

Le code fonctionne bien lorsqu'il est exécuté dans le simulateur et lorsque je télécharge un fichier depuis la photothèque du simulateur, car je dispose d'une connexion Ethernet rapide. Cependant, le même code se bloque sur l'iPhone lorsque l'on sélectionne une image prise avec l'iPhone. J'ai donc essayé en sauvegardant une petite image sur le web et en essayant de la télécharger, ce qui a fonctionné.

Cela m'amène à penser que les grandes images prises par l'iPhone sont décalées dans le temps sur le réseau 3G quelque peu lent. Existe-t-il un moyen de compresser/redimensionner l'image de l'iPhone avant de l'envoyer ?

203voto

Tuan Nguyen Points 1456

Cet extrait redimensionne l'image :

UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

La variable newSize est un CGSize et peut être défini comme suit :

CGSize newSize = CGSizeMake(100.0f, 100.0f);

1 votes

Voici la solution qui semble fonctionner (la taille des données de l'image est passée de 145k à 30k).

9 votes

"CGSize newSize = CGSizeMake(100.0f, 100.0f) ;

0 votes

Superbe ! Ne vous précipitez pas sur les techniques de compression, c'est la solution la plus simple et la plus efficace :)

38voto

Zorayr Points 2637

Une solution autonome :

- (UIImage *)compressForUpload:(UIImage *)original scale:(CGFloat)scale
{
    // Calculate new size given scale factor.
    CGSize originalSize = original.size;
    CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);

    // Scale the original image to match the new size.
    UIGraphicsBeginImageContext(newSize);
    [original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *compressedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return compressedImage;
}

Merci à @Tuan Nguyen.

16voto

nembleton Points 945

Pour compléter @Tuan Nguyen, c'est peut-être la façon la plus rapide et la plus élégante de le faire.

Pour faire un lien vers Article de John Muchow sur iphonedevelopertips.com L'ajout d'une catégorie à une image UII est un moyen très pratique d'augmenter rapidement la taille de l'image. Il suffit d'appeler

    UIImage *_image = [[[UIImage alloc] initWithData:SOME_NSDATA] scaleToSize:CGSizeMake(640.0,480.0)];

vous renvoie une image de représentation 640x480 de vos NSDATA ( qui peut être une image en ligne ) sans aucune autre ligne de code.

1 votes

Il réduit en fait le nombre de pixels. Il réduit donc également la taille de l'image. Mais il ne procède pas à une "recompression" à proprement parler. Si c'est ce que vous mentionnez ici.

7voto

Matthew Frederick Points 14932

L'article de Matt Gemmell MGImageUtilities sont très agréables, avec un redimensionnement efficace et des méthodes permettant de réduire les efforts.

5voto

Rajeev leader Points 347

Utiliser cette méthode simple NSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X