image - Golang如何将图像连接/附加到另一个

标签 image go graphics png

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")
if err != nil {
    fmt.Println(err)
}
imgFile2, err := os.Open("test2.jpg")
if err != nil {
    fmt.Println(err)
}
img1, _, err := image.Decode(imgFile1)
if err != nil {
    fmt.Println(err)
}
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)

关于image - Golang如何将图像连接/附加到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35964656/

相关文章:

mongodb - 如何更新文档数组中的多个嵌套字段

css - 我如何在 css 或任何其他方式中为图像添加叠加层

php - Src 图像和安全性

pointers - 为什么必须对指针使用星号而不是结构指针?

http - http:ContentLength = 105,正文长度为0

java Graphics2d 动画 gif 更新

java - 一个好的 Java 2d 引擎?

c - C图形:如何在屏幕上绘制x-y轴?

javascript - 使用 jQuery/javascript 显示服务器创建的图像

android - 封面图片裁剪安卓