Traitement d'images en Swift : redimensionnement et recadrage pour 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

Traitement d'images en Swift : redimensionnement et recadrage pour iOS et macOS

Le traitement d'images est l'une des tâches les plus courantes lors du développement d'applications mobiles et de bureau. Sur les plateformes Apple (iOS et macOS), pour redimensionner (resize) et recadrer (crop) des images, vous pouvez utiliser à la fois les frameworks intégrés (UIKit pour iOS, AppKit pour macOS) et le puissant framework bas niveau Core Graphics. Dans cet article, nous allons examiner des méthodes universelles qui fonctionnent sur les deux plateformes et fournir des exemples de code prêts à l'emploi en Swift.



Approches principales du traitement d'images

Il existe trois méthodes principales pour redimensionner ou recadrer une image en Swift :

  • UIKit (iOS/tvOS) — utilise la classe UIImage et ses méthodes draw(in:) ou UIGraphicsImageRenderer.
  • AppKit (macOS) — utilise la classe NSImage et le travail avec NSGraphicsContext.
  • Core Graphics (Quartz 2D) — framework C bas niveau multiplateforme qui fonctionne à la fois sur iOS et macOS. Il est basé sur CGImage et les contextes graphiques.

Pour des raisons de polyvalence, nous utiliserons Core Graphics, car il permet d'écrire du code facilement adaptable aux deux plateformes. Cependant, pour les projets iOS, il est souvent plus pratique d'utiliser UIGraphicsImageRenderer — plus simple et plus rapide.



Redimensionnement d'image (Resize)

La fonction resize prend une image source (UIImage ou NSImage) et une nouvelle taille (CGSize). L'algorithme est simple : un contexte graphique de la taille souhaitée est créé, l'image source y est dessinée, puis une nouvelle image est extraite du contexte.



Exemple pour iOS (UIKit)

import UIKit

extension UIImage { func resized(to newSize: CGSize) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: newSize) return renderer.image { _ in self.draw(in: CGRect(origin: .zero, size: newSize)) } }}

// Utilisation :if let image = UIImage(named: "example"), let resized = image.resized(to: CGSize(width: 300, height: 200)) { // utiliser resized}


Exemple pour macOS (AppKit + Core Graphics)

import AppKit

extension NSImage { func resized(to newSize: NSSize) -> NSImage? { guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil } let bitmap = NSBitmapImageRep( bitmapDataPlanes: nil, pixelsWide: Int(newSize.width), pixelsHigh: Int(newSize.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bitmapFormat: .alphaFirst, bytesPerRow: 0, bitsPerPixel: 0 ) guard let context = NSGraphicsContext(bitmapImageRep: bitmap!) else { return nil } NSGraphicsContext.saveGraphicsState() NSGraphicsContext.current = context let rect = NSRect(origin: .zero, size: newSize) self.draw(in: rect, from: .zero, operation: .copy, fraction: 1.0) NSGraphicsContext.restoreGraphicsState() let newImage = NSImage(size: newSize) newImage.addRepresentation(bitmap!) return newImage }}


Recadrage d'image (Crop)

Le recadrage (crop) consiste à extraire une zone rectangulaire de l'image source. Dans Core Graphics, on utilise la fonction cropping(to:) de CGImage. Il est important de noter que les coordonnées dans Core Graphics commencent en bas à gauche, donc pour iOS (où l'axe Y est orienté vers le bas), une transformation des coordonnées peut être nécessaire.



Fonction crop universelle pour iOS et macOS

\

Recommendations