Arbeiten mit Bildern in Swift: Resize, Crop (iOS/macOS)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit Bildern: Resize, Crop in Swift (iOS/macOS)

\n\n

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

\n\n

Grundlegende Ansätze

\n\n

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

In diesem Artikel konzentrieren wir uns auf die erste Methode, da sie am universellsten ist und keine zusätzlichen Abhängigkeiten erfordert.

\n\n

Größe eines Bildes ändern (Resize)

\n\n

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

Beispiel für iOS (UIKit)

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

Beispiel für 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
Wichtig: Für macOS ist die Funktion UIGraphicsBeginImageContextWithOptions nicht verfügbar. Es werden lockFocus()/unlockFocus() oder Core Graphics verwendet.
\n\n

Bild zuschneiden (Crop)

\n\n

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

Universelle Methode mit Core Graphics

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

Empfehlungen