146 votes

Redimensionnez UIImage en conservant le format et la largeur

J'ai vu dans de nombreux articles pour redimensionner l'image en conservant les proportions. Ces fonctions utilisent les points fixes (largeur et hauteur) pour RECT lors du redimensionnement. Mais dans mon projet, je dois redimensionner la vue en fonction de la largeur uniquement. La hauteur doit être prise automatiquement en fonction du rapport de format. quiconque m'aide à atteindre cet objectif.

235voto

Maverick1st Points 1252

La méthode de Srikar fonctionne très bien si vous connaissez la hauteur et la largeur de votre nouvelle taille. Si, par exemple, vous ne connaissez que la largeur à laquelle vous souhaitez vous adapter et que vous vous moquez de la hauteur, vous devez d'abord calculer le facteur d'échelle de la hauteur.

 +(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;
}
 

58voto

Ryan Points 1830

Si vous ne savez pas si l'image sera au format portrait ou paysage (par exemple, l'utilisateur prend une photo avec l'appareil photo), j'ai créé une autre méthode prenant en compte les paramètres de largeur et de hauteur maximum.

Disons que vous avez un UIImage *myLargeImage qui est un ratio de 4: 3.

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

Le UIImage redimensionné sera 1024x768 si paysage; 768x1024 si portrait. Cette méthode générera également des images de résolution supérieure pour l'affichage de la rétine.

 + (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];
}
 

7voto

Srikar Appal Points 26892

La méthode la plus simple consiste à définir le cadre de votre UIImageView et à définir le contentMode sur l’une des options de redimensionnement.

Le code va comme ceci - Cela peut être utilisé comme une méthode utilitaire -

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

5voto

mariusLAN Points 165

Importez simplement AVFoundation et utilisez AVMakeRectWithAspectRatioInsideRect(CGRectCurrentSize, CGRectMake(0, 0, YOUR_WIDTH, CGFLOAT_MAX)

2voto

TheGamingArt Points 692

Pour améliorer la réponse de Ryan:

    + (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];
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X