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

先看效果

image

思路步骤

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

全部源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

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