¿Cómo cambiar el tamaño/optimizar fácilmente el tamaño de una imagen con iOS?

Resuelto jpm asked hace 54 años • 18 respuestas

Mi aplicación descarga un conjunto de archivos de imágenes de la red y los guarda en el disco local del iPhone. Algunas de esas imágenes son de tamaño bastante grande (anchos superiores a 500 píxeles, por ejemplo). Dado que el iPhone ni siquiera tiene una pantalla lo suficientemente grande para mostrar la imagen en su tamaño original, planeo cambiar el tamaño de la imagen a algo un poco más pequeño para ahorrar espacio/rendimiento.

Además, algunas de esas imágenes son JPEG y no se guardan con la configuración de calidad habitual del 60%.

¿Cómo puedo cambiar el tamaño de una imagen con el SDK de iPhone y cómo puedo cambiar la configuración de calidad de una imagen JPEG?

jpm avatar Jan 01 '70 08:01 jpm
Aceptado

Se proporcionan un par de sugerencias como respuesta a esta pregunta . Sugerí la técnica descrita en esta publicación , con el código relevante:

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

   return newImage;
}

En cuanto al almacenamiento de la imagen, el formato de imagen más rápido para usar con el iPhone es PNG, porque tiene optimizaciones para ese formato. Sin embargo, si desea almacenar estas imágenes como JPEG, puede tomar su UIImage y hacer lo siguiente:

NSData *dataForJPEGFile = UIImageJPEGRepresentation(theImage, 0.6);

Esto crea una instancia de NSData que contiene los bytes sin procesar de una imagen JPEG con una configuración de calidad del 60%. El contenido de esa instancia de NSData luego se puede escribir en el disco o almacenar en caché en la memoria.

Brad Larson avatar Mar 05 '2009 02:03 Brad Larson

Los métodos anteriores funcionan bien para imágenes pequeñas, pero cuando intentas cambiar el tamaño de una imagen muy grande, rápidamente te quedarás sin memoria y la aplicación se bloqueará. Una forma mucho mejor es utilizar CGImageSourceCreateThumbnailAtIndexpara cambiar el tamaño de la imagen sin decodificarla completamente primero.

Si tiene la ruta a la imagen que desea cambiar de tamaño, puede usar esto:

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

Más detalles aquí .

Pulkit Goyal avatar Sep 01 '2014 11:09 Pulkit Goyal