Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verkette ich Bilder in Golang?

Wie verkette ich Bilder in Golang?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 11:14:02667Durchsuche

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)

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)

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!

Stellungnahme:
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