48 votes

Veuillez traduire ceci en gardant les mêmes balises HTML s'il en existe: UIImage redimensionner (mise à l'échelle proportionnelle)

Possible Duplicate:
Redimensionner UIImage avec rapport d'aspect?

The following piece of code is resizing the image perfectly, but the problem is that it messes up the aspect ratio (resulting in a skewed image). Any pointers?

// Changer la résolution de l'image (redimensionner automatiquement pour s'adapter)
+ (UIImage *)scaleImage:(UIImage*)image toResolution:(int)resolution {
    CGImageRef imgRef = [image CGImage];
    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);
    CGRect bounds = CGRectMake(0, 0, width, height);

    // Si déjà à la résolution minimale, retourner l'image d'origine, sinon redimensionner
    if (width <= resolution && height <= resolution) {
        return image;

    } else {
        CGFloat ratio = width/height;

        if (ratio > 1) {
            bounds.size.width = resolution;
            bounds.size.height = bounds.size.width / ratio;
        } else {
            bounds.size.height = resolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    UIGraphicsBeginImageContext(bounds.size);
    [image drawInRect:CGRectMake(0.0, 0.0, bounds.size.width, bounds.size.height)];
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return imageCopy;
}

118voto

Mark24x7 Points 752

J'ai utilisé cette seule ligne de code pour créer une nouvelle UIImage qui est mise à l'échelle. Définissez les paramètres de mise à l'échelle et d'orientation pour obtenir ce que vous voulez. La première ligne de code récupère simplement l'image.

// récupérer l'image d'origine
UIImage *originalImage = [UIImage imageNamed:@"myImage.png"];
// mettre à l'échelle à 2.0 rend l'image moitié moins grande.
UIImage *scaledImage = 
            [UIImage imageWithCGImage:[originalImage CGImage] 
                          scale:(originalImage.scale * 2.0)
                             orientation:(originalImage.imageOrientation)];

15voto

Ça va, pas un gros problème. La chose est que tu dois trouver la largeur et la hauteur proportionnelles

par exemple, si la taille est de 2048.0 x 1360.0 et que cela doit être redimensionné en résolution de 320 x 480, alors la taille de l'image résultante devrait être de 722.0 x 480.0

voici la formule pour cela. si w, h est l'original et x, y sont l'image résultante.
w/h=x/y 
=> 
x=(w/h)*y;  

en soumettant w=2048, h=1360, y=480 => x=722.0 (ici la largeur>hauteur. si hauteur>largeur, alors considérez x comme 320 et calculez y)

Vous pouvez soumettre sur cette page web. ARC

Confus ? d'accord, voici une catégorie UIImage qui le fera pour vous.

@interface UIImage (UIImageFunctions)
    - (UIImage *) scaleToSize: (CGSize)size;
    - (UIImage *) scaleProportionalToSize: (CGSize)size;
@end
@implementation UIImage (UIImageFunctions)

- (UIImage *) scaleToSize: (CGSize)size
{
    // Mettre à l'échelle l'image sélectionnée à la taille ciblée
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height));

    if(self.imageOrientation == UIImageOrientationRight)
    {
        CGContextRotateCTM(context, -M_PI_2);
        CGContextTranslateCTM(context, -size.height, 0.0f);
        CGContextDrawImage(context, CGRectMake(0, 0, size.height, size.width), self.CGImage);
    }
    else
        CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage);

    CGImageRef scaledImage=CGBitmapContextCreateImage(context);

    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);

    UIImage *image = [UIImage imageWithCGImage: scaledImage];

    CGImageRelease(scaledImage);

    return image;
}

- (UIImage *) scaleProportionalToSize: (CGSize)size1
{
    if(self.size.width>self.size.height)
    {
        NSLog(@"Paysage");
        size1=CGSizeMake((self.size.width/self.size.height)*size1.height,size1.height);
    }
    else
    {
        NSLog(@"Portrait");
        size1=CGSizeMake(size1.width,(self.size.height/self.size.width)*size1.width);
    }

    return [self scaleToSize:size1];
}

@end

-- l'appel approprié pour faire cela si img est l'instance UIImage.

img=[img scaleProportionalToSize:CGSizeMake(320, 480)];

5voto

Mustafa Points 8387

Ce changement a fonctionné pour moi :

// La taille retournée par CGImageGetWidth(imgRef) & CGImageGetHeight(imgRef) est incorrecte car elle ne respecte pas l'orientation de l'image!
// CGImageRef imgRef = [image CGImage];
// CGFloat width = CGImageGetWidth(imgRef);
// CGFloat height = CGImageGetHeight(imgRef);
//
// Cela renvoie la largeur et la hauteur réelles de la photo (et résout donc le problème)
CGFloat width = image.size.width; 
CGFloat height = image.size.height;
CGRect bounds = CGRectMake(0, 0, width, height);

5voto

Monte Goulding Points 1578

Cela corrige le calcul pour mettre à l'échelle à la taille maximale à la fois en largeur et en hauteur plutôt que juste en fonction de la largeur et de la hauteur d'origine.

- (UIImage *) scaleProportionnellementASize: (CGSize)taille
{
    float ratioLargeur = taille.width/self.size.width;
    float ratioHauteur = taille.height/self.size.height;

    if(ratioLargeur > ratioHauteur)
    {
        taille=CGSizeMake(self.size.width*ratioHauteur,self.size.height*ratioHauteur);
    } else {
        taille=CGSizeMake(self.size.width*ratioLargeur,self.size.height*ratioLargeur);
    }

    return [self scaleToSize:taille];
}

0voto

KennyTM Points 232647

Essayez de rendre la taille de bounds un entier.

#include 
....

    if (ratio > 1) {
        bounds.size.width = resolution;
        bounds.size.height = round(bounds.size.width / ratio);
    } else {
        bounds.size.height = resolution;
        bounds.size.width = round(bounds.size.height * ratio);
    }

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