Skip to content

Instantly share code, notes, and snippets.

@jemygraw
Created September 22, 2015 08:33
Show Gist options
  • Save jemygraw/05a11b89b53106016daf to your computer and use it in GitHub Desktop.
Save jemygraw/05a11b89b53106016daf to your computer and use it in GitHub Desktop.
image composition in go
package main
import (
"fmt"
"image"
"image/draw"
"image/jpeg"
"image/png"
"os"
)
func main() {
mm1Fp, _ := os.Open("mm1.png")
defer mm1Fp.Close()
mm1Image, _ := png.Decode(mm1Fp)
mm1ImageB := mm1Image.Bounds()
mm2Fp, _ := os.Open("mm2.jpg")
defer mm2Fp.Close()
mm2Image, _ := jpeg.Decode(mm2Fp)
mm2ImageB := mm2Image.Bounds()
mm3Fp, _ := os.Open("mm3.jpg")
defer mm3Fp.Close()
mm3Image, _ := jpeg.Decode(mm3Fp)
mm3ImageB := mm3Image.Bounds()
dstH := sum(mm1ImageB.Max.Y-mm1ImageB.Min.Y,
mm2ImageB.Max.Y-mm2ImageB.Min.Y,
mm3ImageB.Max.Y-mm3ImageB.Min.Y)
dstW := max(mm1ImageB.Max.X-mm1ImageB.Min.X,
mm2ImageB.Max.X-mm2ImageB.Min.X,
mm3ImageB.Max.X-mm3ImageB.Min.X)
fmt.Println("Dst Image:", dstW, dstH)
dstX := 0
dstY := 0
p1 := image.Point{
dstX, dstY,
}
fmt.Println("B1:", mm1ImageB)
fmt.Println("P1:", p1)
dstY += mm1ImageB.Max.Y - mm1ImageB.Min.Y
p2 := image.Point{
dstX, dstY,
}
fmt.Println("B2:", mm2ImageB)
fmt.Println("P2:", p2)
dstY += mm2ImageB.Max.Y - mm2ImageB.Min.Y
p3 := image.Point{
dstX, dstY,
}
fmt.Println("B3:", mm3ImageB)
fmt.Println("P3:", p3)
dstRect := image.Rect(0, 0, dstW, dstH)
dstImage := image.NewRGBA(dstRect)
dstRect1 := mm1ImageB.Add(p1)
dstRect2 := mm2ImageB.Add(p2)
dstRect3 := mm3ImageB.Add(p3)
fmt.Println("Dst1:", dstRect1)
fmt.Println("Dst2:", dstRect2)
fmt.Println("Dst3:", dstRect3)
draw.Draw(dstImage, dstRect1, mm1Image, mm1ImageB.Min, draw.Src)
draw.Draw(dstImage, dstRect2, mm2Image, mm2ImageB.Min, draw.Src)
draw.Draw(dstImage, dstRect3, mm3Image, mm3ImageB.Min, draw.Src)
dstFp, _ := os.OpenFile("result.png", os.O_CREATE|os.O_WRONLY, 0666)
png.Encode(dstFp, dstImage)
}
func sum(nums ...int) int {
s := 0
for _, n := range nums {
s += n
}
return s
}
func max(nums ...int) int {
m := nums[0]
for _, n := range nums {
if n > m {
m = n
}
}
return m
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment