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/