Compte tenu d'un uiimage Premier, étant donné une taille forte> uImage strong> code>, je déterminerai trois choses: le rapport 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.
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];
3 Réponses :
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();
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; }
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"
Wheeliebin réponses est correct mais il a oublié un signe moins en face de Desty
destRect = CGRectMake(0, -destY, destSize, destHeight);