Golang如何将图像连接/附加到彼此

Go具有出色的图像处理和数据库,但是我从较小的图像创建一个大图像时遇到了麻烦.有谁知道如何在Golang中获取两个png或jpeg文件并将它们连接起来形成一个包含两个(或更多)文件的大图像?

我正在读这样的png文件

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)

我对如何获取这个png RGBA数据并与其他RGBA数据连接和/或将其组合成“空”图像感到困惑.

创建一个新的空图像(NewRGBA),其边界足以容纳两个图像.然后使用Draw方法在这个新的大图像的适当部分上绘制每个图像.

以下是代码步骤.

加载两张图片.

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

让我们将第二幅图像绘制到第一幅图像的右侧.所以它的起点应该是(w,0),其中w是第一个图像的宽度.第一个图像的右下角将是第二个图像的左下角.

//starting position of the second image (bottom left)
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,r2.Max}

注意此大图像将具有第二个图像的高度.如果第一张图像较高,则会被裁剪.

创建一个新图像.

rgba := image.NewRGBA(r)

现在,您可以将这两个图像绘制到这个新图像中

draw.Draw(rgba,img1.Bounds(),img1,draw.Src)
draw.Draw(rgba,r2,img2,draw.Src)

由于我们创建了r2,因此它位于第一个图像的右侧,第二个图像将被绘制到右侧.

最后你可以导出它.

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

var opt jpeg.Options
opt.Quality = 80

jpeg.Encode(out,rgba,&opt)

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1 Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...