2011-07-15 9 views
14

Quiero cambiar el tamaño de un UIImage manteniendo su relación de aspecto. He escrito el siguiente código, pero no está funcionando como esperaba.Cómo cambiar el tamaño de un UIImage mientras se mantiene su relación de aspecto

Código

-(UIImage *) scaleImage: (UIImage *) image toSize: (CGSize) targetSize { 

    CGFloat scaleFactor = 1.0; 
    if (image.size.width > targetSize.width || image.size.height > targetSize.height) 
     if (!((scaleFactor = (targetSize.width/image.size.width)) > (targetSize.height/image.size.height))) //scale to fit width, or 
      scaleFactor = targetSize.height/image.size.height; // scale to fit heigth. 
    UIGraphicsBeginImageContext(targetSize); 
    CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor)/2, (targetSize.height - image.size.height * scaleFactor)/2, 
     image.size.width * scaleFactor, image.size.height * scaleFactor); 
    [image drawInRect: rect]; 
    UIImage * scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return scaledImage; 
} 

¿Qué es exactamente mal aquí?

Respuesta

42

estoy usando algo similar a esto en algunos proyectos:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize { 
    CGSize scaledSize = newSize; 
    float scaleFactor = 1.0; 
    if(image.size.width > image.size.height) { 
     scaleFactor = image.size.width/image.size.height; 
     scaledSize.width = newSize.width; 
     scaledSize.height = newSize.height/scaleFactor; 
    } 
    else { 
     scaleFactor = image.size.height/image.size.width; 
     scaledSize.height = newSize.height; 
     scaledSize.width = newSize.width/scaleFactor; 
    } 

    UIGraphicsBeginImageContextWithOptions(scaledSize, NO, 0.0); 
    CGRect scaledImageRect = CGRectMake(0.0, 0.0, scaledSize.width, scaledSize.height); 
    [image drawInRect:scaledImageRect]; 
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();  

    return scaledImage; 
} 
+1

Eso se ve bastante similar a lo que está en mis proyectos también,^1. – chown

+2

Esto sesgó mis imágenes, pero UIImage + FX de github https://github.com/nicklockwood/FXImageView tiene relleno de aspecto – PetrV

+0

gracias :) no tiene una deformación realmente buena –

23

Si esto es para mostrarla en una interfaz de usuario, puede utilizar el Interface Builder y especifique el "Aspecto Fit" propiedad.

También puede hacer esto en código mediante el establecimiento de un modo de contenido a UIViewContentModeScaleAspectFit:

imageView.contentMode = UIViewContentModeScaleAspectFit; 
10

Este método toma una imagen y una dimensión máxima. Si la dimensión máxima de la imagen original es menor que la dimensión máxima especificada, recuperará el original para que no se rompa. De lo contrario, obtendrá una nueva imagen con una dimensión máxima de la especificada y otra determinada por la relación de aspecto original. Por ejemplo, si le da una imagen de 1024x768 y una dimensión máxima de 640, obtendrá una versión de 640x480, si le da una imagen de 768x1024 y una dimensión máxima de 640, obtendrá una versión de 480x640.

- (UIImage *)resizeImage:(UIImage *)image 
     withMaxDimension:(CGFloat)maxDimension 
{ 
    if (fmax(image.size.width, image.size.height) <= maxDimension) { 
     return image; 
    } 

    CGFloat aspect = image.size.width/image.size.height; 
    CGSize newSize; 

    if (image.size.width > image.size.height) { 
     newSize = CGSizeMake(maxDimension, maxDimension/aspect); 
    } else { 
     newSize = CGSizeMake(maxDimension * aspect, maxDimension); 
    } 

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0); 
    CGRect newImageRect = CGRectMake(0.0, 0.0, newSize.width, newSize.height); 
    [image drawInRect:newImageRect]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
+0

Muchas gracias ... justo lo que necesitaba – DaSilva

0
- (UIImage *)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { 
    UIGraphicsBeginImageContext(newSize); 
    float ratio = newSize.width/image.size.width; 
    [image drawInRect:CGRectMake(0, 0, newSize.width, ratio * image.size.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    NSLog(@"New Image Size : (%f, %f)", newImage.size.width, newImage.size.height); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
5

En mi caso (que quería tener una imagen en un UIView) y mantener la relación con el diseño automático de la manera descrita here fue genial. La parte más importante del artículo para mí fue (casi citando):

constraint = [NSLayoutConstraint constraintWithItem:self.imageView 
              attribute:NSLayoutAttributeHeight 
              relatedBy:NSLayoutRelationEqual 
              toItem:self.imageView 
              attribute:NSLayoutAttributeWidth 
             multiplier:ration 
              constant:0.0f]; 

[self.imageView addConstraint:constraint]; 

la única cosa es calcular la relación de acuerdo con la anchura y la altura de la imagen real. Me pareció fácil y elegante.

Cuestiones relacionadas