¿Cómo cambiar el tamaño/optimizar fácilmente el tamaño de una imagen con iOS?
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?
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.
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 CGImageSourceCreateThumbnailAtIndex
para 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í .