Comment recadrer une UIImageView à une nouvelle UIImage dans "ajustement" mode?
Je voudrais créer un nouveau UIImage par le recadrage de l'image à l'intérieur d'une UIImageView. Par exemple, dans le ci-dessus pic, je veux un nouveau UIImage de la zone entourée en vert. J'ai trouvé le code pour ce faire, normalement il ressemble à quelque chose comme ceci (comme une UIImage catégorie):
- (UIImage *)croppedImage:(CGRect)bounds {
CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return croppedImage;
}
Sens parfait. CEPENDANT, mon UIImageView est dans contentMode "ajustement". Semble que cela complique le CGRect calculs pour CGImageCreateWithImageInRect et je n'ai pas été en mesure de trouver la bonne solution.
Je me dis que je besoin d'appliquer les mêmes transformations du vert rect comme l'ont été fait à l'image?
AUSSI: j'ai trouvé cette autre question ici (Comment savoir la taille de l'image après l'application de l'aspect ajustement de l'image dans une UIImageView), ce qui semble montrer une force brute façon d'obtenir la taille, mais je ne suis toujours pas sûr de la façon qui convient à un recadrage de la situation.
Des idées?
MODIFIER: Dans mon cas, j'ai littéralement avez un carré comme indiqué ci-dessus établi dans une superposition de vue sur la UIImageView. Ainsi, alors que je me rends compte que je suis en recadrant les UIImage (à l'intérieur de la UIImageView), j'ai besoin de changer quelque chose à la verte CGRect telle qu'elle "correspond" à la transformation quand "ajustement" est appliqué. Par exemple, si je laisse mon UIImageView d'en haut gauche de la mode, alors tout fonctionne bien, car il y a un mappage 1:1 entre les sous-jacents UIImage et la UIImageView. Le problème d'en haut gauche de la mode est que l'ensemble de l'image n'affiche toujours pas, car il pourrait être plus gros que mon UIImageView.
OriginalL'auteur pj4533 | 2012-06-02
Vous devez vous connecter pour publier un commentaire.
Basé sur mon autre réponse à une question similaire, j'ai écrit cette méthode pour une UIImageView catégorie:
Vous pouvez passer dans le cadre de votre vert rect (en supposant que c'est une sous-vue de l'affichage de l'image) et de la culture rect arrière pour recadrer le UIImage. Notez que cela ne fonctionne que pour "adapter " mode"! Je n'ai pas testé. Alors, dites-moi si ça marche!!!
Pouvez-vous m'aider avec le code ci-dessus pour l'échelle pour remplir mode ?
Merci! C'était parfait
Comment voulez-vous régler cet algorithme pour tenir compte des images qui sont 2x et 3x? Pour 1x images cela fonctionne parfaitement, mais ne pas couper avec la précision pour les images avec 2x et 3x échelle.
belle réponse!
OriginalL'auteur Felix
Je sais que la réponse a été mais j'ai eu quelques problèmes de prise en haut, à droite, donc, j'ai l'habitude de poster ma solution.
Le problème est que l'image est redimensionnée avec un aspect en forme, mais nous savons que le facteur d'échelle pour la largeur et la hauteur. Ensuite, nous pouvons calculer le rectangle de recadrage assez facile:
OriginalL'auteur DNRN
Je pense que vous ne comprenez pas ce que vous faites. Vous ne pouvez pas "découper" une UIImageView seule UIImages. Si votre croppedImage méthode doit être dans une UIImage catégorie et pas une UIImageView catégorie.
Les limites rect vous passez à la culture de la méthode doit être en rapport à la taille de l'image, de ne pas l'imageview limites.
Il n'est pas pertinent ce que le contentMode de l'affichage de l'image est - le recadrage de l'image sera toujours le même. De la première à obtenir l'image à partir de l'affichage de l'image. Puis créer une nouvelle image recadrée, et enfin définir l'image recadrée pour l'affichage de l'image. Cela peut être fait en une seule ligne de code:
Depuis votre contentMode est "fit", la nouvelle image sera automatiquement étirer pour s'adapter dans le point de vue image. Vous pouvez également essayer de changer le point de vue image basée sur l'image.taille pour éviter les effets de pixellisation.
Je ne suis pas sûr si je vous comprends bien. Voulez-vous pour masquer l'affichage de l'image de sorte qu'il ne montre que la partie dans le vert rect? Il n'est pas nécessaire pour le recadrage. Ou voulez-vous simplement à dessiner le vert rect à la bonne position?
Je veux créer une nouvelle marque uiimage de la partie à l'intérieur de la green rect.
ok, maintenant je l'ai eu, je pense. Je vais écrire une nouvelle réponse...
OriginalL'auteur Felix
- Je utiliser la méthode ci-dessous.
OriginalL'auteur user5176302