Arbeiten mit Bildern in Swift: resize und crop für 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 in Swift: resize und crop für iOS und macOS

\n

Die Bildverarbeitung ist eine der häufigsten Aufgaben bei der Entwicklung von mobilen und Desktop-Anwendungen. Auf den Apple-Plattformen (iOS und macOS) können für die Größenänderung (resize) und das Zuschneiden (crop) von Bildern sowohl die integrierten Frameworks (UIKit für iOS, AppKit für macOS) als auch das leistungsstarke, niedrigschwellige Core Graphics verwendet werden. In diesem Artikel besprechen wir universelle Methoden, die auf beiden Plattformen funktionieren, und zeigen fertige Codebeispiele in Swift.

\n\n

Grundlegende Ansätze zur Bildverarbeitung

\n

Es gibt drei Hauptwege, um die Größe eines Bildes in Swift zu ändern oder es zuzuschneiden:

\n
    \n
  • UIKit (iOS/tvOS) — verwendet die Klasse UIImage und ihre Methoden draw(in:) oder UIGraphicsImageRenderer.
  • \n
  • AppKit (macOS) — verwendet die Klasse NSImage und die Arbeit mit NSGraphicsContext.
  • \n
  • Core Graphics (Quartz 2D) — ein plattformübergreifendes, niedrigschwelliges C-Framework, das sowohl unter iOS als auch unter macOS funktioniert. Es basiert auf CGImage und grafischen Kontexten.
  • \n
\n

Aus Gründen der Universalität verwenden wir Core Graphics, da es das Schreiben von Code ermöglicht, der leicht an beide Plattformen angepasst werden kann. Für iOS-Projekte ist jedoch oft UIGraphicsImageRenderer praktischer – es ist einfacher und schneller.

\n\n

Größenänderung eines Bildes (Resize)

\n

Die resize-Funktion nimmt ein Quellbild (UIImage oder NSImage) und eine neue Größe (CGSize) entgegen. Der Algorithmus ist einfach: Es wird ein grafischer Kontext in der gewünschten Größe erstellt, das Quellbild hineingezeichnet und dann ein neues Bild aus dem Kontext extrahiert.

\n\n

Beispiel für iOS (UIKit)

\n
import UIKit\n\nextension UIImage {\n    func resized(to newSize: CGSize) -> UIImage? {\n        let renderer = UIGraphicsImageRenderer(size: newSize)\n        return renderer.image { _ in\n            self.draw(in: CGRect(origin: .zero, size: newSize))\n        }\n    }\n}\n\n// Verwendung:\nif let image = UIImage(named: "example"),\n   let resized = image.resized(to: CGSize(width: 300, height: 200)) {\n    // resized verwenden\n}\n
\n\n

Beispiel für macOS (AppKit + Core Graphics)

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

Zuschneiden eines Bildes (Crop)

\n

Zuschneiden (crop) bedeutet, einen rechteckigen Bereich aus dem Quellbild auszuwählen. In Core Graphics wird hierfür die Funktion cropping(to:) von CGImage verwendet. Wichtig zu beachten ist, dass die Koordinaten in Core Graphics von der unteren linken Ecke ausgehen, daher kann für iOS (wo die Y-Achse nach unten zeigt) eine Koordinatentransformation erforderlich sein.

\n\n

Universelle crop-Funktion für iOS und macOS

\

Empfehlungen