加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:23:13 所属栏目:大数据 来源:网络整理
导读:Go具有出色的图像处理和数据库,但是我从较小的图像创建一个大图像时遇到了麻烦.有谁知道如何在Golang中获取两个png或jpeg文件并将它们连接起来形成一个包含两个(或更多)文件的大图像? 我正在读这样的png文件: imgFile,err := os.Open(path)if err != nil {
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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读