Wie verkette ich Bilder in Golang?

Linda Hamilton
Freigeben: 2024-11-06 11:14:02
Original
745 Leute haben es durchsucht

How to Concatenate Images in Golang?

Bilder in Golang verketten

Problem

Obwohl Go robuste Bildbearbeitungsfunktionen bietet, stehen Benutzer oft vor der Herausforderung, ein einzelnes Bild aus mehreren kleineren Bildern zu erstellen . Wie können konkret zwei PNG- oder JPEG-Dateien zu einem Gesamtbild verkettet werden?

Analyse

Der bereitgestellte Code zeigt das Einlesen von PNG-Dateien in ein RGBA-Format:

imgFile, err := os.Open(path)
if err != nil {
    return Image{}, err
}
img, _, err := image.Decode(imgFile)
if err != nil {
    return Image{}, err
}

rgba := image.NewRGBA(img.Bounds())
if rgba.Stride != rgba.Rect.Size().X*4 {
    return Image{}, fmt.Errorf("unsupported stride")
}
draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src)
Nach dem Login kopieren

Der Kern des Problems liegt jedoch darin, zu verstehen, wie man mehrere RGBA-Datensätze in einem einzigen Bild kombiniert.

Lösung

Die Lösung besteht darin, ein neues, leeres Bild (NewRGBA) von zu erstellen ausreichend groß, um beide Originalbilder aufzunehmen. Anschließend kann die Draw-Methode verwendet werden, um jedes Bild auf bestimmte Teile des erweiterten Bildes zu legen:

// Load two images
imgFile1, err := os.Open("test1.jpg")
if err != nil {
    fmt.Println(err)
}
imgFile2, err := os.Open("test2.jpg")
if err != nil {
    fmt.Println(err)
}
img1, _, err := image.Decode(imgFile1)
if err != nil {
    fmt.Println(err)
}
img2, _, err := image.Decode(imgFile2)
if err != nil {
    fmt.Println(err)
}

// Starting position of the second image
sp2 := image.Point{img1.Bounds().Dx(), 0}

// New rectangle for the second image
r2 := image.Rectangle{sp2, sp2.Add(img2.Bounds().Size())}

// Rectangle for the big image
r := image.Rectangle{image.Point{0, 0}, r2.Max}

// Create a new image
rgba := image.NewRGBA(r)

// Draw the two images
draw.Draw(rgba, img1.Bounds(), img1, image.Point{0, 0}, draw.Src)
draw.Draw(rgba, r2, img2, image.Point{0, 0}, draw.Src)

// Export the image
out, err := os.Create("./output.jpg")
if err != nil {
    fmt.Println(err)
}

var opt jpeg.Options
opt.Quality = 80

jpeg.Encode(out, rgba, &opt)
Nach dem Login kopieren

Hinweis: Diese Methode behält die Höhe des zweiten Bildes bei. Wenn das erste Bild größer ist, wird es beschnitten.

Das obige ist der detaillierte Inhalt vonWie verkette ich Bilder in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage