当前位置: 首页 > 面试题库 >

Golang如何串联/附加图像

洪浩
2023-03-14
问题内容

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, 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)


 类似资料:
  • 问题内容: Go内置函数的复杂性是什么?字符串串联使用呢? 我想通过附加两个切片(不包括该元素)从切片中删除一个元素。http://play.golang.org/p/RIR5fXq- Sf http://golang.org/pkg/builtin/#append表示,如果目的地有足够的容量,则该分片为。我希望“切片”是一个恒定时间的操作。我也希望同样适用于使用的字符串连接。 问题答案: 所有这

  • 问题内容: 我有一个数组,例如我的数据列表为JSON。// 我想结合像2的数组,我试图追加它们。-合并-追加 控制者 Beego(golang)API返回JSON 问题答案: 希望是你想要的

  • 问题内容: 这是我的带有SQL查询的PHP代码,但是输出与预期不符: 而且我得到这样的SQL查询: VALUES之后的第一个在哪里? 问题答案: 并具有相同的运算符优先级,但保持关联。第一次串联后的意思是: 该字符串已添加到您的密钥中,例如 因此,该字符串在该数字上下文中转换为整数并 消失 。要解决此问题,请在您的加法前后加上括号。

  • 我正在尝试连接2个字符串,但不确定如何进行连接。 这是我的代码: 我试着用在中添加它,我试着用这种方式创建它,它只显示数字,不显示文本

  • 问题是: 我需要对一个大日志文件的每一行应用多个正则表达式(比如几GB长),收集非空匹配并将它们全部放入一个数组中(用于序列化并通过网络发送)。 如果这个问题的答案是正确的,那么切片并没有多大帮助: 如果片没有足够的容量,append将需要分配新内存并复制旧内存。用于切片 因为可以有几十万个正则表达式匹配,所以我无法真正预测一个片段的长度/容量。我也不能让它太大,“以防万一”bc这会浪费内存(或者

  • 问题内容: 我有以下查询,该查询返回所有员工的薪水。这项工作正常,但我需要收集将汇总到一个单元格中的额外数据(请参见结果集2)。 如何将数据汇总到逗号分隔的列表中?有点像Sum所做的事情,但是我需要一个字符串作为回报。 结果集1 我需要: 结果集2 问题答案: 对于SQL Server 2005+,请使用STUFF函数和FOR XML PATH: 但是您缺少有关要转换为逗号分隔的字符串的数据的位置