Travail avec les images : resize, crop en Swift (iOS/macOS)
\n\nLe traitement d'images est l'une des tâches clés lors du développement d'applications pour iOS et macOS. Qu'il s'agisse de charger un avatar utilisateur, de préparer des aperçus de photos ou de travailler avec du contenu graphique, vous aurez presque certainement besoin d'opérations de redimensionnement (resize) et de recadrage (crop). Dans cet article, nous allons voir comment effectuer ces tâches en Swift en utilisant les frameworks intégrés UIKit (pour iOS) et AppKit (pour macOS), ainsi que le framework universel Core Graphics.
Approches principales
\n\nDans l'écosystème Apple, il existe plusieurs façons de manipuler les images. Nous allons examiner les deux plus populaires et performantes :
\n\n- \n
- UIKit / AppKit + Core Graphics — une approche de bas niveau mais très flexible. Permet un contrôle précis de la qualité et de la taille du résultat. \n
- Image I/O — un framework pour travailler avec les métadonnées et le codage/décodage d'images. Idéal pour les tâches où la performance est importante lors du travail avec de gros fichiers. \n
Dans cet article, nous nous concentrerons sur la première méthode, car elle est la plus universelle et ne nécessite pas de dépendances supplémentaires.
\n\nRedimensionnement d'image (Resize)
\n\nLa fonction de redimensionnement prend une image source et une taille cible, et retourne une nouvelle image avec les paramètres spécifiés. Il est important de conserver les proportions pour éviter les distorsions.
\n\nExemple pour iOS (UIKit)
\n\nimport UIKit\n\nextension UIImage {\n func resized(to targetSize: CGSize) -> UIImage? {\n // Détermine l'échelle pour s'adapter à targetSize en conservant les proportions\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n // Nouvelle taille avec conservation des proportions\n let newSize = CGSize(width: size.width * scale, height: size.height * scale)\n \n // Crée un contexte graphique avec la nouvelle taille\n UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)\n draw(in: CGRect(origin: .zero, size: newSize))\n let newImage = UIGraphicsGetImageFromCurrentImageContext()\n UIGraphicsEndImageContext()\n \n return newImage\n }\n}\n\n// Utilisation :\nif let image = UIImage(named: "example"),\n let resized = image.resized(to: CGSize(width: 300, height: 200)) {\n // Utilisez resized\n}\n\nExemple pour macOS (AppKit)
\n\nimport AppKit\n\nextension NSImage {\n func resized(to targetSize: NSSize) -> NSImage? {\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n let newSize = NSSize(width: size.width * scale, height: size.height * scale)\n let newImage = NSImage(size: newSize)\n \n newImage.lockFocus()\n draw(in: NSRect(origin: .zero, size: newSize),\n from: NSRect(origin: .zero, size: size),\n operation: .copy,\n fraction: 1.0)\n newImage.unlockFocus()\n \n return newImage\n }\n}\n\nImportant : Pour macOS, la fonction\n\nUIGraphicsBeginImageContextWithOptionsn'est pas disponible. On utiliselockFocus()/unlockFocus()ou Core Graphics.
Recadrage d'image (Crop)
\n\nLe recadrage permet d'extraire une zone rectangulaire de l'image source. Il est souvent utilisé pour créer des avatars carrés ou supprimer les bords superflus.
\n\nMéthode universelle avec Core Graphics
\n\nimport CoreGraphics\n\nextension UIImage {\n func cropped(to rect: CGRect) -> UIImage? {\n guard let cgImage = self.cgImage else { ret Aussi dans la bibliothèque
Programmation réactive en Swift : Combine et RxSwift pour iOS/macOS
Journalisation pour TypeScript : la bibliothèque Winston
Travailler avec XML en JavaScript (Node.js) : parsing, création et validation
ORM pour Go (Golang) : comparaison et exemples de bibliothèques populaires