一尘不染

Golang如何串联/附加图像

go

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数据连接和/或将其组合成“空”图像感到困惑。


阅读 245

收藏
2020-07-02

共1个答案

一尘不染

创建一个新的空白图像(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, 0}, r2.Max}

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

创建一个新图像。

rgba := image.NewRGBA(r)

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

draw.Draw(rgba, img1.Bounds(), img1, image.Point{0, 0}, draw.Src)
draw.Draw(rgba, r2, img2, image.Point{0, 0}, 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)
2020-07-02