J'ai un code qui redimensionne une image afin que je puisse obtenir un morceau à l'échelle du centre de l'image - je l'utilise pour prendre un UIImage
et retourner une petite représentation carrée d'une image, similaire à ce qui est vu dans la vue de l'album de l'application Photos. (Je sais que je pourrais utiliser un UIImageView
et ajuster le mode de recadrage pour obtenir les mêmes résultats, mais ces images sont parfois affichées dans UIWebViews
).
J'ai commencé à remarquer des plantages dans ce code et je suis un peu perplexe. J'ai deux théories différentes et je me demande si l'une ou l'autre est sur la base.
Théorie 1) Je réalise le recadrage en dessinant dans un contexte d'image hors écran de ma taille cible. Puisque je veux la partie centrale de l'image, je mets l' CGRect
argument passé àdrawInRect
à quelque chose qui est plus grand que les limites de mon contexte d'image. J'espérais que c'était casher, mais est-ce que j'essaye plutôt de dessiner sur d'autres souvenirs que je ne devrais pas toucher?
Théorie 2) Je fais tout cela dans un fil de fond. Je sais qu'il y a des parties d'UIKit qui sont limitées au thread principal. Je supposais / espérais que dessiner sur une vue hors écran n'en faisait pas partie. Ai-je tort?
(Oh, comment je manque la NSImage's drawInRect:fromRect:operation:fraction:
méthode.)
Réponses:
Mise à jour 2014-05-28: J'ai écrit cela lorsque iOS 3 ou quelque chose de nouveau était chaud, je suis certain qu'il existe de meilleures façons de le faire maintenant, peut-être intégré. Comme beaucoup de personnes l'ont mentionné, cette méthode ne prend pas en compte la rotation; lisez quelques réponses supplémentaires et répandez un peu d'amour pour que les réponses à cette question soient utiles à tout le monde.
Réponse originale:
Je vais copier / coller ma réponse à la même question ailleurs:
Il n'y a pas de méthode de classe simple pour ce faire, mais il existe une fonction que vous pouvez utiliser pour obtenir les résultats souhaités:
CGImageCreateWithImageInRect(CGImageRef, CGRect)
vous aidera.Voici un court exemple d'utilisation:
la source
imageOrientation
est réglé sur autre chose que vers le haut, leCGImage
fait pivoter par rapport auUIImage
et le rectangle de recadrage sera incorrect. Vous pouvez faire pivoter le rectangle de recadrage en conséquence, mais le fraîchement crééUIImage
auraimageOrientation
, de sorte que le recadréCGImage
sera pivoté à l'intérieur.[UIImage imageWithCGImage:imageRef scale:largeImage.scale orientation:largeImage.imageOrientation];
Pour recadrer des images de la rétine tout en conservant la même échelle et la même orientation, utilisez la méthode suivante dans une catégorie UIImage (iOS 4.0 et supérieur):
la source
self.scale
, non?CGImageRelease(imageRef);
avec ARC activé?Vous pouvez créer une catégorie UIImage et l'utiliser où vous en avez besoin. Basé sur la réponse et les commentaires de HitScans ci-dessous.
Vous pouvez l'utiliser de cette façon:
la source
[[UIScreen mainScreen] scale]
être justeself.scale
? L'échelle de l'image peut ne pas être la même que l'échelle de l'écran.No visible @interface for 'UIImage' declares the selector 'crop'
même si j'ai mis les fichiers de catégorie .h et .m dans mon projet et importé le .h dans la classe que j'utilise dans la catégorie. Une idée?Version Swift 3
avec l'aide de cette fonction de pont
CGRectMake
->CGRect
(crédits à cette réponse répondu par@rob mayoff
):L'utilisation est:
Production:
la source
guard
la première ligne en cas deUIImage.CGImage
retoursnil
et pourquoi l'utiliservar
quandlet
fonctionne parfaitement.cropping(to:)
très attentivement les documents. Le résultatCGImage
contient une forte référence à la plus grande àCGImage
partir de laquelle il a été recadré. Donc , si vous voulez seulement accrocher à l'image recadrée et ont pas besoin original, jetez un oeil sur les autres solutions.right
alors le cgImage devrait être tourné de 90 degrés ccw, donc le rect de recadrage devrait aussi être tournéVoici mon implémentation de recadrage UIImage qui obéit à la propriété imageOrientation. Toutes les orientations ont été minutieusement testées.
la source
implicit declaration of function 'rad' is invalid in c99
peut être supprimé en remplaçant: rad (90), rad (-90), rad (-180) -> M_PI_2, -M_PI_2, -_M_PIcontains undefined reference for architecture armv7
Suis-je absent d'une bibliothèque? CoreGraphics est importé.CGImage
Attention : toutes ces réponses supposent un objet image à dos.image.CGImage
peut retourner nil, si leUIImage
est soutenu par unCIImage
, ce qui serait le cas si vous créiez cette image à l'aide d'unCIFilter
.Dans ce cas, vous devrez peut-être dessiner l'image dans un nouveau contexte et renvoyer cette image ( lentement ).
la source
Aucune des réponses ici ne traite correctement tous les problèmes d'échelle et de rotation. Voici une synthèse de tout ce qui a été dit jusqu'à présent, à jour depuis iOS7 / 8. Il est censé être inclus en tant que méthode dans une catégorie sur UIImage.
la source
Version rapide de
awolf
la réponse de, qui a fonctionné pour moi:la source
La plupart des réponses que j'ai vues ne concernent qu'une position de (0, 0) pour (x, y). Ok c'est un cas mais j'aimerais que mon opération de recadrage soit centrée. Ce qui m'a pris du temps à comprendre, c'est la ligne qui suit le commentaire de la WTF.
Prenons le cas d'une image capturée avec une orientation portrait:
J'espère que cela a du sens! Si ce n'est pas le cas, essayez différentes valeurs, vous verrez que la logique est inversée quand il s'agit de choisir les bons x, y, largeur et hauteur pour votre cropRect.
la source
swift3
la source
Extension rapide
la source
Meilleure solution pour recadrer un UIImage dans Swift , en terme de précision, mise à l'échelle des pixels ...:
Instructions utilisées pour appeler cette fonction:
Remarque: l'inspiration initiale du code source écrite en Objective-C a été trouvée sur le blog "Cocoanetics".
la source
L'extrait de code ci-dessous peut être utile.
la source
Semble un peu étrange mais fonctionne très bien et prend en compte l'orientation de l'image:
la source
Swift 5:
la source
la source
la source
Sur iOS9.2SDK, j'utilise la méthode ci-dessous pour convertir le cadre de UIView en UIImage
la source
Mise à jour Swift 2.0 (
CIImage
compatibilité)Extension de la réponse de Maxim, mais fonctionne également si votre image est
CIImage
basée.la source
Voici une version mise à jour de Swift 3 basée sur la réponse de Noodles
la source
Suivez la réponse de @Arne. Je fixe juste la fonction Catégorie. mettez-le dans la catégorie de UIImage.
la source
Je n'étais pas satisfait des autres solutions car elles consomment plusieurs fois (en utilisant plus de puissance que nécessaire) ou ont des problèmes d'orientation. Voici ce que j'ai utilisé pour une image recadrée carrée à l'échelle à partir d'une image UIImage *.
la source
J'utilise la méthode ci-dessous.
}
la source
Regardez https://github.com/vvbogdan/BVCropPhoto
la source