Bildverarbeitung mit Go: Größenänderung und Zuschneiden (resize, crop)

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 Go: Größenänderung (resize) und Zuschneiden (crop)

\n\n

In der modernen Webentwicklung und bei der Erstellung von Backend-Diensten besteht häufig die Notwendigkeit, Grafikdateien zu verarbeiten: Gewichtsreduzierung, Vereinheitlichung des Formats, Erstellung von Miniaturansichten. Die Sprache Go (Golang) bietet mehrere leistungsstarke und effiziente Bibliotheken für die Bildverarbeitung. In diesem Artikel werden wir zwei Schlüsseloperationen im Detail betrachten – Größenänderung (resize) und Zuschneiden (crop) – unter Verwendung beliebter Werkzeuge.

\n\n

Warum Go für die Bildverarbeitung?

\n

Go wird in nativen Code kompiliert, bietet hohe Leistung und integrierte Unterstützung für Multithreading. Dies macht es zu einer ausgezeichneten Wahl für die Erstellung hochbelastbarer Dienste zur Bildverarbeitung. Im Gegensatz zu Python, wo oft das Kissen Pillow (C-Erweiterungen) verwendet wird, bietet Go reine Go-Implementierungen, die sich leicht in eine Microservice-Architektur integrieren lassen.

\n\n

Wichtige Bibliotheken

\n
    \n
  • github.com/disintegration/imaging – die beliebteste Bibliothek. Bietet eine benutzerfreundliche API für resize, crop, rotate, blur und andere Operationen. Arbeitet auf Basis des Standardpakets image.
  • \n
  • github.com/nfnt/resize – eine der ersten Bibliotheken. Zeichnet sich durch hohe Geschwindigkeit und Unterstützung verschiedener Interpolationsalgorithmen (NearestNeighbor, Bilinear, Lanczos2, Lanczos3) aus.
  • \n
  • github.com/anthonynsimon/bild – ein neueres Projekt mit Fokus auf Leistung und Codeklarheit. Unterstützt resize, crop, Effekte.
  • \n
\n\n

In diesem Artikel konzentrieren wir uns auf die Bibliothek imaging, da sie hinsichtlich Funktionalität und Benutzerfreundlichkeit am ausgewogensten ist.

\n\n

Installation

\n

Um zu beginnen, muss die Bibliothek mit go get installiert werden:

\n
go get github.com/disintegration/imaging
\n\n

Größenänderung eines Bildes (Resize)

\n

Die resize-Operation ermöglicht es, ein Bild auf neue Abmessungen zu skalieren. Die Bibliothek imaging unterstützt mehrere Modi:

\n
    \n
  • Fit – passt das Bild in ein gegebenes Rechteck ein, unter Beibehaltung der Proportionen.
  • \n
  • Fill – füllt das Rechteck aus, schneidet bei Bedarf die Ränder ab.
  • \n
  • Resize – genaue Änderung auf die angegebene Breite und Höhe (ohne Beibehaltung der Proportionen).
  • \n
\n\n

Beispiel für eine grundlegende Größenänderung unter Beibehaltung der Proportionen (Fit):

\n
package main\n\nimport (\n    "github.com/disintegration/imaging"\n    "log"\n)\n\nfunc main() {\n    // Öffnen des Quellbildes\n    src, err := imaging.Open("input.jpg")\n    if err != nil {\n        log.Fatalf("Fehler beim Öffnen: %v", err)\n    }\n\n    // Größe auf Breite 800px ändern, Höhe wird automatisch berechnet\n    dst := imaging.Fit(src, 800, 600, imaging.Lanczos)\n\n    // Speichern des Ergebnisses\n    err = imaging.Save(dst, "output_fit.jpg")\n    if err != nil {\n        log.Fatalf("Fehler beim Speichern: %v", err)\n    }\n    log.Println("Bild erfolgreich verarbeitet!")\n}
\n\n

Wenn Sie eine genaue Größenänderung benötigen (z.B. zum Erstellen eines 150x150-Vorschaubildes):

\n
// Genaue Größenänderung (kann Proportionen verzerren)\ndst := imaging.Resize(src, 150, 150, imaging.Lanczos)
\n\n

Zuschneiden eines Bildes (Crop)

\n

Das Zuschneiden ermöglicht es, einen Teil des Bildes zu entfernen. In imaging gibt es zwei Hauptmethoden:

\n
    \n
  • Crop – schneidet einen rechteckigen Bereich basierend auf den angegebenen Koordinaten aus.
  • \n
  • CropCenter – schneidet den mittleren Bereich der angegebenen Größe aus.
  • \n
\n\n

Beispiel für das Zuschneiden des mittleren Bereichs (nützlich zum Erstellen quadratischer Avatare):

\n
package main\n\nimport (\n    "github.com/disintegration/imaging"\n    "log"\n)\n\nfunc main() {\n    src, err :                    

Empfehlungen