Travail avec les images en Swift : redimensionnement, recadrage (iOS/macOS)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travail avec les images : resize, crop en Swift (iOS/macOS)

\n\n

Le 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.

\n\n

Approches principales

\n\n

Dans 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
\n\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\n

Redimensionnement d'image (Resize)

\n\n

La 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\n

Exemple pour iOS (UIKit)

\n\n
import 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\n

Exemple pour macOS (AppKit)

\n\n
import 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\n
Important : Pour macOS, la fonction UIGraphicsBeginImageContextWithOptions n'est pas disponible. On utilise lockFocus()/unlockFocus() ou Core Graphics.
\n\n

Recadrage d'image (Crop)

\n\n

Le 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\n

Méthode universelle avec Core Graphics

\n\n
import CoreGraphics\n\nextension UIImage {\n    func cropped(to rect: CGRect) -> UIImage? {\n        guard let cgImage = self.cgImage else { ret                    

Recommendations