ホームページ  >  記事  >  バックエンド開発  >  Golang で画像を連結するにはどうすればよいですか?

Golang で画像を連結するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 11:14:02667ブラウズ

How to Concatenate Images in Golang?

Golang での画像の連結

問題

Go は堅牢な画像操作機能を提供しますが、ユーザーは多くの場合、複数の小さな画像から 1 つの画像を作成するという課題に直面します。 。具体的には、2 つの PNG または JPEG ファイルを連結して包括的な画像を形成するにはどうすればよいでしょうか?

分析

提供されたコードは、PNG ファイルを RGBA 形式に読み込むことを明らかにします。

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)

ただし、問題の核心は、複数の RGBA データセットを 1 つの画像に結合する方法を理解することにあります。

解決策

解決策には、次の新しい空の画像 (NewRGBA) を作成することが含まれます。両方の元の画像を収容するのに十分なサイズ。その後、Draw メソッドを使用して、拡張された画像の指定された部分に各画像をオーバーレイできます。

// 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)

注: このメソッドは 2 番目の画像の高さを保持します。最初の画像の高さが高い場合はトリミングされます。

以上がGolang で画像を連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。