go语言写起来真的好嗨哟!

先看效果

image

思路步骤

  • 用到一个第三方库,github.com/nfnt/resize 用于调整大小。
  • 人像图片需要放在相框的后面。
  • 大小以相框为准,尤其是宽度,所以第一步就是把人像宽度变为相框宽度,或者小于相框宽度。
  • 然后合成,主要用到的方法是draw()。
  • 如果你要把go编译打包,部署到linux 你需要执行一下命令!
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go

全部源码


package main import ( "errors" "github.com/nfnt/resize" "image" "image/draw" "image/jpeg" "image/png" "os" "strings" ) func main() { index := os.Args[2] imgC := os.Args[1] ///upload/gy/oldpic/5c44b484198c3.jpg k := "/opt/server/games-server/upload/gy/k" + index + ".png" imgb, _ := os.Open("/opt/server/games-server" + imgC) img, _ := jpeg.Decode(imgb) defer imgb.Close() wmb, _ := os.Open(k) watermark, _ := png.Decode(wmb) defer wmb.Close() offset := image.Pt(0, 0) b := watermark.Bounds() m := image.NewRGBA(b) imgW := b.Size().X imgH := b.Size().Y wd := 1400 / imgW newImg := ImageResize(img, 1400, imgH*wd) draw.Draw(m, newImg.Bounds().Add(image.Pt(50, 100)), newImg, image.ZP, draw.Src) draw.Draw(m, watermark.Bounds().Add(offset), watermark, image.ZP, draw.Over) imgw, _ := os.Create("/opt/server/games-server" + strings.Replace(imgC, "oldpic", "newpic", -1)) jpeg.Encode(imgw, m, &jpeg.Options{jpeg.DefaultQuality}) defer imgw.Close() } // 图片大小调整 func ImageResize(src image.Image, w, h int) image.Image { return resize.Resize(uint(w), uint(h), src, resize.Lanczos3) } // 图片裁剪 暂时没有用 func ImageCopy(src image.Image, x, y, w, h int) (image.Image, error) { var subImg image.Image if rgbImg, ok := src.(*image.YCbCr); ok { subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.YCbCr) //图片裁剪x0 y0 x1 y1 } else if rgbImg, ok := src.(*image.RGBA); ok { subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.RGBA) //图片裁剪x0 y0 x1 y1 } else if rgbImg, ok := src.(*image.NRGBA); ok { subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.NRGBA) //图片裁剪x0 y0 x1 y1 } else { return subImg, errors.New("图片解码失败") } return subImg, nil }

欢迎访问我的Blog: http://yondu.vip