2011-05-02 13 views
20

Estoy desarrollando una aplicación donde un usuario podría intentar cargar imágenes muy grandes. Estas imágenes se muestran primero como miniaturas en una vista de tabla. Mi código original se bloqueaba en imágenes grandes, así que lo estoy reescribiendo para descargar primero la imagen directamente en el disco.cambiar el tamaño de un UIImage sin cargarlo por completo en la memoria?

¿Hay alguna manera conocida de cambiar el tamaño de una imagen en el disco sin cargarla completamente en la memoria a través de UIImage? Actualmente estoy tratando de cambiar el tamaño usando las categorías en UIImage como se detalla here, pero mi aplicación se bloquea al intentar ver una imagen muy grande en miniatura (como, por ejemplo, this - advertencia, imagen grande).

Respuesta

45

Debería echar un vistazo a CGImageSource en ImageIO.framework, pero solo está disponible desde iOS 4.0.

Ejemplo rápido:

-(UIImage*)resizeImageToMaxSize:(CGFloat)max path:(NSString*)path 
{ 
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL); 
    if (!imageSource) 
     return nil; 

    CFDictionaryRef options = (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: 
     (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
     (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, 
     (id)@(max), 
     (id)kCGImageSourceThumbnailMaxPixelSize, 
     nil]; 
    CGImageRef imgRef = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options); 

    UIImage* scaled = [UIImage imageWithCGImage:imgRef]; 

    CGImageRelease(imgRef); 
    CFRelease(imageSource); 

    return scaled; 
} 
+0

¿Cómo puedo agregar un valor Seperated para la altura y el ancho? ¿Son estos valores de retina? ¿Tengo que elegir 2048 o 1024 para una pantalla ipad retina? – Raegtime

+1

Debe hacer x * [UIScreen mainScreen] .scale –

+0

¿Qué es @max aquí? –

Cuestiones relacionadas