Dans mon application iPhone, je prends une photo avec l'appareil photo, puis je veux la redimensionner à 290 * 390 pixels. J'utilisais cette méthode pour redimensionner l'image:
UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
interpolationQuality:1];
Cela fonctionne parfaitement, mais c'est une fonction non documentée, donc je ne peux plus l'utiliser avec l'iPhone OS4.
Alors ... quelle est la façon la plus simple de redimensionner un UIImage?
Réponses:
Le moyen le plus simple consiste à définir le cadre de votre
UIImageView
et à définir l'contentMode
une des options de redimensionnement.Ou vous pouvez utiliser cette méthode utilitaire, si vous avez réellement besoin de redimensionner une image:
Exemple d'utilisation:
la source
newImage
sera déjà libéré automatiquement, et il devrait jusqu'à la méthode qui a appelé cela pour le conserver ou non. Cette approche ne fait que demander un bogue de mémoire car elleinit
ne fait pas partie du nom de la méthode. Je m'attendrais à ce qu'une méthode nommée comme ceci retourne un objet libéré automatiquement.UIGraphicsBeginImageContextWithOptions
Voici une version Swift de la réponse de Paul Lynch
Et en extension:
la source
Bonne solution Swift 3.0 pour iOS 10+ :
ImageRenderer
syntaxe d' utilisation et de fermeture:Et voici la version Objective-C:
la source
Trevor Howard a quelques catégories UIImage qui gèrent très bien le redimensionnement. Si rien d'autre, vous pouvez utiliser le code comme exemples.
Remarque: depuis iOS 5.1, cette réponse n'est peut-être pas valide. Voir commentaire ci-dessous.
la source
Une version plus compacte pour Swift 4 et iOS 10+:
Usage:
la source
J'ai également vu cela aussi (que j'utilise
UIButtons
pour l'état Normal et Sélectionné car les boutons neresize
conviennent pas). Le mérite revient à celui qui était l'auteur original.Créez d'abord un fichier .h et .m vide appelé
UIImageResizing.h
etUIImageResizing.m
Incluez ce fichier .h dans le fichier .m dans lequel vous allez utiliser la fonction, puis appelez-le comme ceci:
la source
Cette amélioration du code de Paul vous donnera une image haute résolution nette sur un iPhone avec un écran rétine. Sinon, lors de la réduction, c'est flou.
la source
UIGraphicsBeginImageContextWithOptions
utilisera automatiquement l'échelle de l'écran principal (à partir d'iOS 3.2).Voici un moyen simple:
resizedImage est une nouvelle image.
la source
Solution Swift pour Stretch Fill, Aspect Fill et Aspect Fit
et pour l'utiliser, vous pouvez faire ce qui suit:
Merci à abdullahselek pour sa solution originale.
la source
Voici une modification de la catégorie écrite par iWasRobbed ci-dessus. Il conserve le rapport hauteur / largeur de l'image d'origine au lieu de la déformer.
la source
Si vous voulez juste une image plus petite et ne vous souciez pas de la taille exacte:
Définition de l'échelle sur
0.25f
vous donnera une image de 816 x 612 à partir d'un appareil photo 8MP.Voici une catégorie UIImage + Scale pour ceux qui en ont besoin.
la source
Pourquoi si compliqué? Je pense que l'utilisation de l'API système peut atteindre le même résultat:
Le seul problème est que vous devez passer l'inverse du rapport cible comme deuxième argument, car selon le document, le deuxième paramètre spécifie le rapport de l'image d'origine par rapport à la nouvelle échelle.
la source
Il s'agit d'une extension UIImage compatible avec Swift 3 et Swift 4 qui redimensionne l'image à une taille donnée avec un rapport d'aspect
Exemple d'utilisation
la source
scaledImage(with size:)
ouscaledWithSize(_:)
. AussiUIGraphicsGetImageFromCurrentImageContext
ne peut vraiment revenirnil
, donc!
fonctionnerait aussi bien. Vous pouvez également simplifier la création de rect enCGRect(origin: .zero, size: size)
.J'ai trouvé une catégorie pour UIImage dans les propres exemples d'Apple qui fait le même tour. Voici le lien: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Vous n'aurez qu'à changer l'appel:
en
imageWithImage:scaledToSize:inRect:
avec:Afin de considérer le canal alpha dans l'image.
la source
la source
Pour mes collègues Xamarians, voici une version Xamarin.iOS C # de @Paul Lynch.
la source
Si vous souhaitez créer une vignette d'un UIImage (avec redimensionnement proportionnel ou peut-être un recadrage impliqué), consultez la catégorie UIImage + Resize qui vous permet d'utiliser une syntaxe concise de type ImageMagick:
la source
[cf Chris] Pour redimensionner à la taille souhaitée:
ou, de manière équivalente, remplacer
CGImageGetWidth(...)/DESIREDWIDTH
la source
Rogerio Chaves répond comme une extension rapide
Et aussi des bonus
la source
Swift 3.0 avec option de sécurité intégrée (renvoie l'image d'origine en cas d'erreur):
la source
(Compatible avec Swift 4) iOS 10+ et iOS <10 (en utilisant
UIGraphicsImageRenderer
si possible,UIGraphicsGetImageFromCurrentImageContext
sinon)la source
Approche efficace sans étirer l'image Swift 4
// Méthode d'appel
la source
La réponse de @Paul Lynch est excellente, mais cela changerait le rapport d'image. si vous ne souhaitez pas modifier le rapport d'image et que vous souhaitez toujours que la nouvelle image soit adaptée à la nouvelle taille, essayez ceci.
la source
utiliser cette extension
la source
Swift 2.0:
la source
Voici mon code Swift quelque peu bavard
la source
guard
) à laaspectRatioAwareSize
fonction afin qu'elle ne génère pas d'exception de division par zéro si les paramètres d'entrée pour imageSize ou boxSize sontCGSize.zero
Réponse de Swift 4:
la source
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
J'ai découvert qu'il est difficile de trouver une réponse que vous pouvez utiliser prête à l'emploi dans votre projet Swift 3 . Le principal problème des autres réponses est qu'elles n'honorent pas le canal alpha de l'image. Voici la technique que j'utilise dans mes projets.
Exemple d'utilisation:
Ce code est une réécriture de l'extension d' Apple avec un support supplémentaire pour les images avec et sans canal alpha.
Comme lecture supplémentaire, je recommande de consulter cet article pour différentes techniques de redimensionnement d'image. L'approche actuelle offre des performances décentes, elle exploite des API de haut niveau et faciles à comprendre. Je vous recommande de vous y tenir, sauf si vous trouvez que le redimensionnement de l'image est un goulot d'étranglement dans vos performances.
la source
Utilisez cette extension, au cas où vous ne deviez redimensionner la largeur / hauteur qu'avec le rapport hauteur / largeur.
la source