Mon application télécharge un ensemble de fichiers image à partir du réseau et les enregistre sur le disque iPhone local. Certaines de ces images sont assez grandes (largeurs supérieures à 500 pixels, par exemple). Étant donné que l'iPhone n'a même pas un écran assez grand pour afficher l'image dans sa taille d'origine, je prévois de redimensionner l'image à quelque chose d'un peu plus petit pour économiser de l'espace / des performances.
De plus, certaines de ces images sont des JPEG et elles ne sont pas enregistrées selon le paramètre de qualité habituel de 60%.
Comment puis-je redimensionner une image avec le SDK iPhone et comment modifier le paramètre de qualité d'une image JPEG?
Le moyen le plus simple et le plus simple de redimensionner vos images serait le suivant
la source
Les méthodes ci-dessus fonctionnent bien pour les petites images, mais lorsque vous essayez de redimensionner une très grande image, vous allez rapidement manquer de mémoire et planter l'application. Un bien meilleur moyen consiste à
CGImageSourceCreateThumbnailAtIndex
redimensionner l'image sans la décoder complètement au préalable.Si vous avez le chemin d'accès à l'image que vous souhaitez redimensionner, vous pouvez utiliser ceci:
Plus de détails ici .
la source
CGImageSource
en plus des images et des pdfs?inSampleSize
celui utilisé par le décodeur d'Android. Et c'est la seule réponse qui offre un moyen de réduire une image d'une manière efficace en mémoire.La meilleure façon de redimensionner les images sans perdre le rapport hauteur / largeur (c'est-à-dire sans étirer l'image) est d'utiliser cette méthode:
Ajoutez cette méthode à votre classe Utility afin de pouvoir l'utiliser tout au long de votre projet et y accéder comme suit:
Cette méthode prend en charge la mise à l'échelle tout en conservant les proportions. Il ajoute également des retraits à l'image au cas où l'image réduite a plus de largeur que de hauteur (ou vice versa).
la source
Si vous avez le contrôle sur le serveur, je vous recommande fortement de redimensionner le côté serveur d'images avec ImageMagik . Le téléchargement d'images de grande taille et leur redimensionnement sur le téléphone est un gaspillage de nombreuses ressources précieuses - bande passante, batterie et mémoire. Tous sont rares sur les téléphones.
la source
J'ai développé une solution ultime pour la mise à l'échelle d'image dans Swift.
Vous pouvez l'utiliser pour redimensionner l'image pour remplir, remplir d'aspect ou ajuster l'aspect à la taille spécifiée.
Vous pouvez aligner l'image au centre ou à l'un des quatre bords et quatre coins.
Et vous pouvez également réduire l'espace supplémentaire qui est ajouté si les rapports hauteur / largeur de l'image d'origine et de la taille cible ne sont pas égaux.
Vous trouverez ci-dessous des exemples d'application de cette solution.
Le rectangle gris est l'image du site cible sera redimensionnée. Les cercles bleus dans un rectangle bleu clair sont l'image (j'ai utilisé des cercles car il est facile de voir quand ils sont mis à l'échelle sans préserver l'aspect). La couleur orange clair marque les zones qui seront coupées si vous passez
trim: true
.Ajustement de l'aspect avant et après la mise à l'échelle:
Un autre exemple d' ajustement d'aspect :
Ajustement d'aspect avec alignement supérieur:
Remplissage d'aspect :
Remplir :
J'ai utilisé la mise à l'échelle dans mes exemples parce que c'est plus simple à démontrer, mais la solution fonctionne également pour la réduction d'échelle comme en question.
Pour la compression JPEG, vous devez utiliser ceci:
Vous pouvez consulter mon essentiel avec le terrain de jeu Xcode.
la source
Pour Swift 3, le code ci-dessous met l'image à l'échelle en conservant le rapport hauteur / largeur. Vous pouvez en savoir plus sur ImageContext dans la documentation d'Apple :
Pour l'utiliser, appelez la
resizeImage()
méthode:la source
vous pouvez utiliser ce code pour redimensionner l'image à la taille requise.
la source
Selon cette session, iOS Memory Deep Dive , nous ferions mieux de l'utiliser
ImageIO
pour réduire les images.Le mal d'utiliser des
UIImage
images bas de gamme.Utilisation
ImageIO
ImageIO peut lire les tailles d'image et les informations de métadonnées sans salir la mémoire.
ImageIO peut redimensionner les images au prix d'une image redimensionnée uniquement.
À propos de l'image en mémoire
UIGraphicsBeginImageContextWithOptions
utilise toujours leSRGB
format de rendu, qui utilise 4 octets par pixel.load -> decode -> render
3 phases.UIImage
coûte cher pour le dimensionnement et le redimensionnementPour l'image suivante, si vous utilisez,
UIGraphicsBeginImageContextWithOptions
nous n'avons besoin que de 590 Ko pour charger une image, alors que nous avons besoin de2048 pixels x 1536 pixels x 4 bytes per pixel
= 10 Mo lors du décodagetandis que
UIGraphicsImageRenderer
, introduit dans iOS 10, choisira automatiquement le meilleur format graphique dans iOS12. Cela signifie que vous pouvez économiser 75% de la mémoire en remplaçantUIGraphicsBeginImageContextWithOptions
parUIGraphicsImageRenderer
si vous n'avez pas besoin de SRGB.Ceci est mon article sur les images iOS en mémoire
ou
la source
Un problème qui peut survenir sur les écrans Retina est que l'échelle de l'image est définie par ImageCapture ou plus. Les fonctions de redimensionnement ci-dessus ne changeront pas cela. Dans ces cas, le redimensionnement ne fonctionnera pas correctement.
Dans le code ci-dessous, l'échelle est définie sur 1 (non mise à l'échelle) et l'image renvoyée a la taille que vous attendez. Ceci est fait dans l'
UIGraphicsBeginImageContextWithOptions
appel.la source
Ajout à la multitude de réponses ici, mais j'ai opté pour une solution qui redimensionne par taille de fichier, plutôt que par dimensions.
Cela réduira à la fois les dimensions et la qualité de l'image jusqu'à ce qu'elle atteigne votre taille donnée.
Crédit pour la mise à l' échelle par taille de réponse
la source
Version Swift
la source
J'ai fini par utiliser la technique de Brads pour créer une
scaleToFitWidth
méthodeUIImage+Extensions
si cela est utile à quelqu'un ...puis où tu veux
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
Il convient également de noter que vous pouvez déplacer cela plus bas dans une
UIView+Extensions
classe si vous souhaitez rendre des images à partir d'un UIViewla source
Je voulais juste répondre à cette question pour les programmeurs de Cocoa Swift. Cette fonction renvoie NSImage avec une nouvelle taille. Vous pouvez utiliser cette fonction comme ceci.
la source
Si votre image se trouve dans le répertoire de documents, ajoutez cette extension d' URL :
Usage:
Remarque: - Remplacez <LocalImagePath.jpg> par le chemin de votre image jpg locale.
la source
Si quelqu'un cherche toujours une meilleure option
la source
la source
Pour redimensionner une image, j'ai de meilleurs résultats (graphiques) en utilisant cette fonction au lieu de DrawInRect:
Le rapport hauteur / largeur est pris en charge automatiquement
la source