Arbeiten mit Bildern in Swift: resize und crop für iOS und macOS
\nDie 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.
Grundlegende Ansätze zur Bildverarbeitung
\nEs gibt drei Hauptwege, um die Größe eines Bildes in Swift zu ändern oder es zuzuschneiden:
\n- \n
- UIKit (iOS/tvOS) — verwendet die Klasse
UIImageund ihre Methodendraw(in:)oderUIGraphicsImageRenderer. \n - AppKit (macOS) — verwendet die Klasse
NSImageund die Arbeit mitNSGraphicsContext. \n - Core Graphics (Quartz 2D) — ein plattformübergreifendes, niedrigschwelliges C-Framework, das sowohl unter iOS als auch unter macOS funktioniert. Es basiert auf
CGImageund grafischen Kontexten. \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.
Größenänderung eines Bildes (Resize)
\nDie 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.
Beispiel für iOS (UIKit)
\nimport 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\nBeispiel für macOS (AppKit + Core Graphics)
\nimport 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\nZuschneiden eines Bildes (Crop)
\nZuschneiden (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.
Universelle crop-Funktion für iOS und macOS
\Auch in der Bibliothek
Kryptographie in TypeScript: Verschlüsselung und Hashing in der Praxis
Symfony/Cache für PHP: Komplette Anleitung mit Beispielen
Arbeiten mit Markdown in Java: Bibliotheken, Parsing und Konvertierung
Internationalisierung (i18n) in Java: Vollständiger Leitfaden mit Beispielen
Markdown-Verarbeitung in Swift für iOS und macOS: Bibliotheken und Beispiele