package main import ( "fmt" "image" "image/draw" "image/jpeg" "os" ) func main() { imgFile1, err := os.Open("img1.jpg") if err != nil { fmt.Println(err) } imgFile2, err := os.Open("img2.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) } //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) out, err := os.Create("./output.jpg") if err != nil { fmt.Println(err) } var opt jpeg.Options opt.Quality = 80 jpeg.Encode(out, rgba, &opt) }