7
votes

Utilisation correcte de l'uirectClip pour réduire un uiimage jusqu'à la taille de l'icône

Compte tenu d'un uiimage de toute dimension, je souhaite générer une version carrée "icône" version de la taille, pixels code> pixels sur un côté, sans distorsion (étirement). Cependant, je rencontre un petit accrochage. Pas tout à fait sûr où le problème est. Voici ce que je fais jusqu'à présent.

Premier, étant donné une taille forte> uImage strong> code>, je déterminerai trois choses: le rapport code> à utiliser lorsque réduire l'image; un delta ​​code> (la différence entre notre taille d'icône souhaitée et le côté le plus long), et un décalage code> (utilisé pour comprendre notre coordonnée d'origine lors de la décollage de l'image):

UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];


0 commentaires

3 Réponses :


7
votes

Eureka! J'ai eu des choses un peu mélangées. Cela fonctionne:

CGRect clipRect = CGRectMake(-offset.x, -offset.y,
                             (ratio * size.width) + delta,
                             (ratio * size.height) + delta);
UIGraphicsBeginImageContext(CGSizeMake(px, px));
UIRectClip(clipRect);
[myImage drawInRect:clipRect];
UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();

// Do something with the icon here ...

UIGraphicsEndImageContext();


0 commentaires

1
votes

Je voulais réaliser une chose similaire mais j'ai trouvé la réponse de l'affiche originale ne fonctionnait pas bien. Il a déformé l'image. Cela pourrait bien être uniquement parce qu'il n'a pas posté toute la solution et qu'il avait modifié une partie de la manière dont les variables sont initialisées:

+(UIImage *)makeIconImage:(UIImage *)image
{
    CGFloat destSize = 400.0;
    CGRect rect = CGRectMake(0, 0, destSize, destSize);

    UIGraphicsBeginImageContext(rect.size);

    if(image.size.width != image.size.height)
    {
        CGFloat ratio;
        CGRect destRect;

        if (image.size.width > image.size.height)
        {
            ratio = destSize / image.size.height;

            CGFloat destWidth = image.size.width * ratio;
            CGFloat destX = (destWidth - destSize) / 2.0;

            destRect = CGRectMake(-destX, 0, destWidth, destSize);

        }
        else
        {
            ratio = destSize / image.size.width;

            CGFloat destHeight = image.size.height * ratio;
            CGFloat destY = (destHeight - destSize) / 2.0;

            destRect = CGRectMake(0, destY, destSize, destHeight);
        }
        [image drawInRect:destRect];
    }
    else
    {
        [image drawInRect:rect];
    }
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledImage;
}


2 commentaires

Merci de partager cela! Cela fait longtemps que j'ai regardé ce que j'ai fini avec. Je ne voulais absolument pas ou n'avoir aucune distorsion à l'aide de ma méthode. Votre «plus grand carré possible» sonne judicieuse et je suis vraiment heureux d'entendre UirectClip n'est pas nécessaire. (Autres lecteurs, veuillez peser et voir comment cela vous vole aussi!)


Merci spécifiquement pour la phrase ", il n'est pas nécessaire d'utiliser uicliprect - si vous faites le contexte de la taille de l'image que vous souhaitez extraire, aucun dessin réel ne sera effectué en dehors de ce record de toute façon"



0
votes

Wheeliebin réponses est correct mais il a oublié un signe moins en face de Desty

destRect = CGRectMake(0, -destY, destSize, destHeight);


0 commentaires