Arbeiten mit Bildern: Resize, Crop in Swift (iOS/macOS)
\n\nDie Bildverarbeitung ist eine der Kernaufgaben bei der Entwicklung von Apps für iOS und macOS. Ob es um das Hochladen eines Benutzeravatars, die Erstellung von Foto-Vorschaubildern oder die Arbeit mit grafischen Inhalten geht – Sie werden mit hoher Wahrscheinlichkeit die Operationen zur Größenänderung (resize) und zum Zuschneiden (crop) benötigen. In diesem Artikel erläutern wir, wie Sie diese Aufgaben in Swift mit den integrierten Frameworks UIKit (für iOS) und AppKit (für macOS) sowie dem universellen Core Graphics ausführen.
Grundlegende Ansätze
\n\nIm Apple-Ökosystem gibt es mehrere Möglichkeiten zur Bildmanipulation. Wir betrachten die zwei gängigsten und leistungsfähigsten:
\n\n- \n
- UIKit / AppKit + Core Graphics – ein low-level, aber sehr flexibler Ansatz. Ermöglicht eine präzise Kontrolle über Qualität und Größe des Ergebnisses. \n
- Image I/O – ein Framework für die Arbeit mit Metadaten und der Kodierung/Dekodierung von Bildern. Ideal für Aufgaben, bei denen die Leistung bei der Arbeit mit großen Dateien wichtig ist. \n
In diesem Artikel konzentrieren wir uns auf die erste Methode, da sie am universellsten ist und keine zusätzlichen Abhängigkeiten erfordert.
\n\nGröße eines Bildes ändern (Resize)
\n\nDie Funktion zur Größenänderung nimmt ein Quellbild und eine Zielgröße entgegen und gibt ein neues Bild mit den angegebenen Parametern zurück. Es ist wichtig, das Seitenverhältnis beizubehalten, um Verzerrungen zu vermeiden.
\n\nBeispiel für iOS (UIKit)
\n\nimport UIKit\n\nextension UIImage {\n func resized(to targetSize: CGSize) -> UIImage? {\n // Bestimmt den Skalierungsfaktor, um in die Zielgröße zu passen, unter Beibehaltung des Seitenverhältnisses\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n // Neue Größe unter Beibehaltung des Seitenverhältnisses\n let newSize = CGSize(width: size.width * scale, height: size.height * scale)\n \n // Erstellt einen Grafikkontext mit der neuen Größe\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// Verwendung:\nif let image = UIImage(named: "example"),\n let resized = image.resized(to: CGSize(width: 300, height: 200)) {\n // Verwenden Sie resized\n}\n\nBeispiel für 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\nWichtig: Für macOS ist die Funktion\n\nUIGraphicsBeginImageContextWithOptionsnicht verfügbar. Es werdenlockFocus()/unlockFocus()oder Core Graphics verwendet.
Bild zuschneiden (Crop)
\n\nDas Zuschneiden ermöglicht es, einen rechteckigen Bereich aus dem Quellbild auszuwählen. Es wird am häufigsten verwendet, um quadratische Avatare zu erstellen oder überflüssige Ränder zu entfernen.
\n\nUniverselle Methode mit Core Graphics
\n\nimport CoreGraphics\n\nextension UIImage {\n func cropped(to rect: CGRect) -> UIImage? {\n guard let cgImage = self.cgImage else { ret Auch in der Bibliothek
GraphQL Java: Ein leistungsstarkes Werkzeug zur Erstellung moderner APIs in Java
Swift Package Manager für Swift: Komplettleitfaden mit Beispielen
Rust Task Scheduler: Überblick über Bibliotheken und Codebeispiele
OAuth-Client für JavaScript (Node.js): Überblick und Anwendungsbeispiele
Maschinelles Lernen mit Go: Bibliotheken für Golang (ML, neuronale Netze, NLP)