Arbeiten mit Bildern in Go (Golang): Überblick über Bibliotheken und praktische Beispiele
Go (Golang) ist eine kompilierte, statisch typisierte Sprache, die in der Webentwicklung, bei Microservices und datenverarbeitenden Aufgaben immer beliebter wird. Im Gegensatz zu Python, wo traditionell OpenCV oder Pillow für die Bildbearbeitung verwendet werden, gibt es in Go mehrere leichte und schnelle Bibliotheken, die grundlegende Operationen mit Rastergrafiken ermöglichen: Größenänderung, Zuschneiden, Drehen, Anwenden von Filtern und Zeichnen.
In diesem Artikel betrachten wir die drei beliebtesten Bibliotheken für die Bildbearbeitung in Go: imaging, nfnt/resize und gg. Sie erfahren, wie Sie diese installieren, und sehen Codebeispiele für typische Aufgaben.
1. Die Bibliothek imaging
imaging ist eine einfache, aber leistungsstarke Bibliothek zur Bildverarbeitung. Sie bietet praktische Funktionen zum Ändern der Größe, Zuschneiden, Drehen, Anwenden von Filtern (Weichzeichnen, Schärfen, Farbinvertierung) und Speichern in verschiedenen Formaten (JPEG, PNG, GIF, BMP).
Installation
go get -u github.com/disintegration/imagingBeispiel: Größenänderung und Zuschneiden
package main
import ( "fmt" "github.com/disintegration/imaging" "log")
func main() { // Bild öffnen src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("Fehler beim Öffnen der Datei: %v", err) }
// Größe auf 800x600 ändern, Proportionen beibehalten dst := imaging.Resize(src, 800, 600, imaging.Lanczos) // Mittleren Bereich 400x400 zuschneiden dst = imaging.CropCenter(dst, 400, 400)
// Weichzeichnungsfilter anwenden dst = imaging.Blur(dst, 3.0)
// Ergebnis speichern err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("Fehler beim Speichern: %v", err) } fmt.Println("Bild verarbeitet und als output.jpg gespeichert")}Die Bibliothek unterstützt viele Filter: imaging.Grayscale, imaging.Invert, imaging.Contrast, imaging.Sharpen und andere. Alle funktionieren „out of the box“.
2. Die Bibliothek nfnt/resize
Wenn Ihre Aufgabe nur die Größenänderung von Bildern mit maximaler Leistung ist, ist nfnt/resize die beste Wahl. Sie ist für die Hochgeschwindigkeitsverarbeitung optimiert und unterstützt verschiedene Interpolationsalgorithmen (NearestNeighbor, Bilinear, Bicubic, Lanczos2, Lanczos3).
Installation
go get -u github.com/nfnt/resizeBeispiel: Größenänderung mit verschiedenen Algorithmen
package main
import ( "image" "image/jpeg" "log" "os" "github.com/nfnt/resize")
func main() { file, err := os.Open("input.jpg") if err != nil { log.Fatal(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { log.Fatal(err) }
// Größe auf Breite 300 Pixel ändern, Höhe wird automatisch berechnet m := resize.Resize(300, 0, img, resize.Lanczos3)
out, err := os.Create("resized.jpg") if err != nil { log.Fatal(err) } defer out.Close()
// Mit JPEG-Qualität 90% speichern err = jpeg.Encode(out, m, &jpeg.Options{Quality: 90}) if err != nil { log.Fatal(err) } log.Println("Bild auf Breite 300px verkleinert")}Diese Bibliothek bietet keine Funktionen zum Zuschneiden oder für Filter, aber ihre Geschwindigkeit und Minimalismus machen sie ideal für Server, die Tausende von Bildern pro Sekunde verarbeiten müssen.
3. Die Bibliothek gg (Zeichnen)
gg ist eine Bibliothek zum Zeichnen von 2D-Grafiken, ähnlich wie cairo oder Pillow Draw. Sie ermöglicht das Erstellen von Bildern