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)