Compresser les images afin de réduire la taille du fichier

Je suis en train de construire une application qui permet à l'utilisateur de prendre une photo ou sélectionnez-le dans la bibliothèque de l'iPhone et de le transférer à l'analyse backend.

Le problème que je me pose est au sujet de la taille du fichier.

J'ai lu à propos de ce que les grands acteurs comme Facebook, Twitter, Instagram et Google au sujet de la résolution et de la taille du fichier mais je n'arrive pas à proximité.

Je suis sûr qu'ils ont le meilleur code et les outils pour le faire, mais je serai heureux de la mettre en œuvre aussi bien que possible avec iOS processus réguliers.

C'est ce que je suis en train de faire maintenant:

- (UIImage *)normalResImageForAsset:(ALAsset*)asset
{
    //Convert ALAsset to UIImage
    UIImage *image = [self highResImageForAsset:asset];

    //Determine output size
    CGFloat maxSize = 1024.0f;
    CGFloat width = image.size.width;
    CGFloat height = image.size.height;
    CGFloat newWidth = width;
    CGFloat newHeight = height;

    //If any side exceeds the maximun size, reduce the greater side to 1200px and proportionately the other one
    if (width > maxSize || height > maxSize) {
        if (width > height) {
            newWidth = maxSize;
            newHeight = (height*maxSize)/width;
        } else {
            newHeight = maxSize;
            newWidth = (width*maxSize)/height;
        }
    }

    //Resize the image
    CGSize newSize = CGSizeMake(newWidth, newHeight);
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //Set maximun compression in order to decrease file size and enable faster uploads & downloads
    NSData *imageData = UIImageJPEGRepresentation(newImage, 0.0f);
    UIImage *processedImage = [UIImage imageWithData:imageData];

    return processedImage;
}

Je suis en train de faire 1024px le nombre maximum autorisé de la taille (à la fois avec l'ot de la hauteur) pour démarrer certaines restrictions et puis je suis en train d'utiliser un maximum de compression pour réduire la taille.

Cela fonctionne et les coupures d'environ 50% de la taille de l'image sans vraiment d'endommager des fichiers Jpeg, mais il reste encore beaucoup de choses. Spécialement si les photos sont prises avec la caméra du téléphone et téléchargées. L'image traitée peut toujours facile d'avoir de 1 mo taille qui est beaucoup trop.

Je suppose que je pourrais manquer de certains utiles étape ou en utilisant la bonne technique.

Tout commentaire serait grandement apprécié.

Je me pose des questions sur le voyage aller-retour de UIImage à NSData et retour à UIImage. Avez-vous cochez la case [données images de longueur] avant d'initialiser une nouvelle UIImage? Peut-être que vous voulez retourner la codées NSData objet à partir de cette fonction, de sorte que vous pouvez télécharger le tableau d'octets pour le serveur.
Permettre à l'utilisateur de choisir la taille de l'image et de la mettre en garde à propos de la taille des données à télécharger si nécessaire.
Mais l'OP est juste qu'à 1024x768px, un comprimé d'image jpeg ne doit pas prendre jusqu'à 1 mo.
Je suis à l'aide d'Aviary photo editor et en suivant les docs des exemples, ce est le moyen de transmettre les données. Peut-être pas le seul moyen, mais cela peut expliquer pourquoi j'ai l'aller-retour. Lors de l'utilisation de fichiers PNG compression fonctionne comme prévu, mais le JPEG sont peut-être trop compressé déjà à travailler comme ça.

OriginalL'auteur Juan González | 2013-09-08