190 votes

UIImage : Redimensionner, puis récolte

J'ai été bashing mon visage dans celui-ci pour littéralement jours maintenant et même si je me sens constamment que je suis à droite sur le bord de l'apocalypse, je ne peut tout simplement pas atteindre mon objectif.

J'ai pensé à l'avance dans le conceptuel phases de ma conception, que ce serait une mince affaire que de récupérer une image à partir de la la caméra de l'iPhone ou de la bibliothèque, mise à l'échelle vers le bas à une hauteur spécifiée, à l'aide d'une fonction équivalente à l' Aspect Remplir option de UIImageView (entièrement dans le code), et puis la culture tout ce qui ne rentre pas dans un passé CGRect.

L'obtention de l'image d'origine de la caméra ou de la bibliothèque, a été négligeable. Je suis choqué de voir combien difficile les deux autres mesures ont s'est avéré être.

L'image jointe montre ce que je suis en train de réaliser. Quelqu'un aurait veuillez avoir la gentillesse de me tenir la main? Chaque exemple de code que j'ai trouvé jusqu'à présent, semble pour casser l'image, être à l'envers vers le bas, regarde comme de la merde, dessiner en dehors des limites, ou sinon, il suffit de ne pas fonctionner correctement.

249voto

Jane Sales Points 10895

J’ai eu besoin de la même chose : dans mon cas, de choisir la dimension qui correspond à la fois mise à l’échelle et puis des cultures chaque extrémité pour s’adapter au reste de la largeur. (Je travaille dans le paysage, donc n’avez ne peut-être pas remarqué toute lacune en mode portrait). Voici mon code - c’est une partie d’un categeory sur UIImage. Taille de la cible dans mon code est toujours définie à la taille plein écran de l’appareil.

77voto

Brad Larson Points 122629

Un ancienne poste contient le code d’une méthode pour redimensionner votre UIImage. Le passage pertinent est le suivant :

Dans la mesure du recadrage va, je pense que si vous modifiez la méthode pour utiliser une taille différente pour la mise à l’échelle que pour le contexte, votre image qui en résulte devrait être découpé de façon aux limites du contexte.

19voto

Anybody Points 141
 + (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize {
    //If scaleFactor is not touched, no scaling will occur      
    CGFloat scaleFactor = 1.0;

    //Deciding which factor to use to scale the image (factor = targetSize / imageSize)
    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); 

    //Creating the rect where the scaled image is drawn in
    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);

    //Draw the image into the rect
    [image drawInRect:rect];

    //Saving the image, ending image context
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return scaledImage;
}
 

Je propose celui-ci. N'est-elle pas une beauté? ;)

15voto

yonel Points 6648

Il y a un super code lié au redimensionnement des images + plusieurs autres opérations. Je suis venu autour de celui-ci en essayant de comprendre comment redimensionner les images ... http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

7voto

cdstamper Points 196

Voici. Celui-ci est parfait ;-)

EDIT: voir ci-dessous comment - "Ne fonctionne pas avec certaines images, échoue avec: CGContextSetInterpolationQuality: erreur de contexte 0x0 invalide"

 // Resizes the image according to the given content mode, taking into account the image's orientation
- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode imageToScale:(UIImage*)imageToScale bounds:(CGSize)bounds interpolationQuality:(CGInterpolationQuality)quality {
    //Get the size we want to scale it to
    CGFloat horizontalRatio = bounds.width / imageToScale.size.width;
    CGFloat verticalRatio = bounds.height / imageToScale.size.height;
    CGFloat ratio;

    switch (contentMode) {
        case UIViewContentModeScaleAspectFill:
            ratio = MAX(horizontalRatio, verticalRatio);
            break;

        case UIViewContentModeScaleAspectFit:
            ratio = MIN(horizontalRatio, verticalRatio);
            break;

        default:
            [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode];
    }

    //...and here it is
    CGSize newSize = CGSizeMake(imageToScale.size.width * ratio, imageToScale.size.height * ratio);


    //start scaling it
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGImageRef imageRef = imageToScale.CGImage;
    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                newRect.size.width,
                                                newRect.size.height,
                                                CGImageGetBitsPerComponent(imageRef),
                                                0,
                                                CGImageGetColorSpace(imageRef),
                                                CGImageGetBitmapInfo(imageRef));

    CGContextSetInterpolationQuality(bitmap, quality);

    // Draw into the context; this scales the image
    CGContextDrawImage(bitmap, newRect, imageRef);

    // Get the resized image from the context and a UIImage
    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    // Clean up
    CGContextRelease(bitmap);
    CGImageRelease(newImageRef);

    return newImage;
}
 

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