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方法在此新大图像的适当部分上绘制每个图像。
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。第一张图片的右下角将是第二张图片的左下角。
(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是在第一个图像的右侧创建的,因此第二个图像将在右侧绘制。
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)