76 votos

Cambiar el tamaño de UIImage manteniendo la relación de Aspecto y la anchura

He visto en muchos posts para cambiar el tamaño de la imagen, manteniendo la relación de aspecto. Estas funciones utiliza los puntos fijos(Anchura y Altura) para RECT mientras se cambia de tamaño. Pero en mi proyecto, necesito cambiar el tamaño de la vista en función de la Anchura solos, la Altura debe ser tomado de forma automática basándose en la relación de aspecto. alguien me ayudará a lograr esto.

155voto

Maverick1st Puntos 1252

El método de Srikar funciona muy bien, si sabes tanto de la altura y la anchura de su nuevo Tamaño. Si, por ejemplo, saben que sólo el ancho que desee para escalar a y no se preocupan por la altura que primero tiene que calcular el factor de escala de la altura.

+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width
{
    float oldWidth = sourceImage.size.width;
    float scaleFactor = i_width / oldWidth;

    float newHeight = sourceImage.size.height * scaleFactor;
    float newWidth = oldWidth * scaleFactor;

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return newImage;
}

43voto

Ryan Puntos 1830

Si usted no sabe si la imagen va a ser vertical u horizontal (e.g usuario toma foto con la cámara), he creado otro método que se lleva a max parámetros width y height.

Digamos que usted tiene un UIImage *myLargeImage que es un 4:3 relación.

UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage 
                                        scaledToMaxWidth:1024 
                                               maxHeight:1024];

El cambiar de tamaño UIImage será de 1024 x 768 si el paisaje; 768x1024 si el retrato. Este método también va a generar mayor resolución las imágenes para la pantalla retina.

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]);
    } else {
        UIGraphicsBeginImageContext(size);
    }
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();

    return newImage;
}

+ (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height {
    CGFloat oldWidth = image.size.width;
    CGFloat oldHeight = image.size.height;

    CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;

    CGFloat newHeight = oldHeight * scaleFactor;
    CGFloat newWidth = oldWidth * scaleFactor;
    CGSize newSize = CGSizeMake(newWidth, newHeight);

    return [self imageWithImage:image scaledToSize:newSize];
}

4voto

Srikar Appal Puntos 26892

La forma más sencilla es establecer el marco de su UIImageView y el conjunto de la contentMode a una de las opciones de cambio de tamaño.

El código va como esto - Esto puede ser utilizado como un método de utilidad -

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

2voto

mariusLAN Puntos 165

Sólo tiene que importar AVFoundation y uso AVMakeRectWithAspectRatioInsideRect(CGRectCurrentSize, CGRectMake(0, 0, YOUR_WIDTH, CGFLOAT_MAX)

2voto

TheGamingArt Puntos 692

Para mejorar Ryan respuesta:

   + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
CGFloat oldWidth = image.size.width;
        CGFloat oldHeight = image.size.height;

//You may need to take some retina adjustments into consideration here
        CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;

return [UIImage imageWithCGImage:image.CGImage scale:scaleFactor orientation:UIImageOrientationUp];
    }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X