Travailler avec les images en Swift (iOS/macOS)
Dans cet article, nous examinerons les principales approches et outils pour travailler avec les images dans l'écosystème Apple. Vous apprendrez à charger, afficher, traiter et enregistrer des images à l'aide des frameworks intégrés Swift pour iOS et macOS. Ce contenu sera utile aussi bien aux débutants qu'aux développeurs expérimentés.
Frameworks principaux pour travailler avec les images
Dans Swift, il existe plusieurs frameworks clés pour travailler avec les graphismes :
- UIKit (iOS) —
UIImage,UIImageView - AppKit (macOS) —
NSImage,NSImageView - Core Image — filtres et traitement
- Core Graphics — dessin de bas niveau
- Metal — accélération GPU pour les opérations complexes
- SwiftUI — interface déclarative avec
Image
Chargement et affichage des images
Examinons des exemples de base pour les deux plateformes.
iOS (UIKit)
import UIKit
// Chargement depuis les assetslet image = UIImage(named: "example")
// Chargement depuis un fichierif let path = Bundle.main.path(forResource: "photo", ofType: "jpg") { let imageFromFile = UIImage(contentsOfFile: path)}
// Affichage dans UIImageViewlet imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))imageView.image = imageimageView.contentMode = .scaleAspectFitmacOS (AppKit)
import AppKit
// Chargement depuis les assetslet image = NSImage(named: "example")
// Chargement depuis un fichierif let path = Bundle.main.path(forResource: "photo", ofType: "jpg") { let imageFromFile = NSImage(contentsOfFile: path)}
// Affichage dans NSImageViewlet imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))imageView.image = imageimageView.imageScaling = .scaleProportionallyUpOrDownSwiftUI (multi-plateforme)
import SwiftUI
struct ContentView: View { var body: some View { Image("example") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 200, height: 200) }}Traitement des images avec Core Image
Core Image fournit plus de 200 filtres intégrés pour le traitement d'images. Voici un exemple d'application de sépia :
import CoreImage
func applySepiaFilter(to image: UIImage) -> UIImage? { guard let ciImage = CIImage(image: image) else { return nil } let filter = CIFilter(name: "CISepiaTone") filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(0.8, forKey: kCIInputIntensityKey) guard let outputImage = filter?.outputImage else { return nil } let context = CIContext() guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil } return UIImage(cgImage: cgImage)}Redimensionnement et recadrage
Il est souvent nécessaire de redimensionner une image ou de la recadrer au centre :
extension UIImage { func resized(to targetSize: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: targetSize) return renderer.image { _ in self.draw(in: CGRect(origin: .zero, size: targetSize)) } } func croppedToSquare() -> UIImage { let side = min(size.width, size.height) let x = (size.width - side) / 2 let y = (size.height - side) / 2 let cropRect = CGRect(x: x, y: y, width: side, height: side) guard let cgImage = cgImage?.cropping(to: cropRect) else { return self } return UIImage(cgImage: cgImage) }}Enregistrement des images
Voyons comment enregistrer une image dans la galerie ou dans un fichier :