/
poster.go
executable file
·144 lines (128 loc) · 2.87 KB
/
poster.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package poster
import (
"image"
"image/color"
"image/draw"
"image/jpeg"
"io/ioutil"
"os"
"github.com/golang/freetype"
"github.com/golang/freetype/truetype"
"github.com/skip2/go-qrcode"
)
//新PNG载体
type Rect struct {
X0 int
X1 int
Y0 int
Y1 int
}
// Pt 坐标
type Pt struct {
X int
Y int
}
// DImage 图片切片
type DImage struct {
PNG draw.Image //合并到的PNG切片,可用image.NewrRGBA设置
X int //横坐标
Y int //纵坐标
}
// DText 文字切片
type DText struct {
PNG draw.Image //合并到的PNG切片,可用image.NewrRGBA设置
Title string //文字
X int //横坐标
Y int //纵坐标
Size float64
R uint8
G uint8
B uint8
A uint8
}
// NewMerged 新建文件载体
func NewMerged(path string) (*os.File, error) {
f, err := os.Create(path)
if err != nil {
return nil, err
}
return f, nil
}
// NewPNG 新建图片载体
func NewPNG(X0 int, Y0 int, X1 int, Y1 int) *image.RGBA {
return image.NewRGBA(image.Rect(X0, Y0, X1, Y1))
}
// MergeImage 合并图片到载体
func MergeImage(PNG draw.Image, image image.Image, imageBound image.Point) {
draw.Draw(PNG, PNG.Bounds(), image, imageBound, draw.Over)
}
// LoadTextType 读取字体类型
func LoadTextType(path string) (*truetype.Font, error) {
fbyte, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
trueTypeFont, err := freetype.ParseFont(fbyte)
if err != nil {
return nil, err
}
return trueTypeFont, nil
}
// NewDrawText 创建新字体切片
func NewDrawText(png draw.Image) *DText {
return &DText{
PNG: png,
Size: 18,
X: 0,
Y: 0,
R: 0,
G: 0,
B: 0,
A: 255,
}
}
// SetColor 设置字体颜色
func (dtext *DText) SetColor(R uint8, G uint8, B uint8) {
dtext.R = R
dtext.G = G
dtext.B = B
}
// MergeText 合并字体到载体
func (dtext *DText) MergeText(title string, tf *truetype.Font, x int, y int, rect image.Rectangle) error {
fc := freetype.NewContext()
//设置屏幕每英寸的分辨率
fc.SetDPI(72)
//设置用于绘制文本的字体
fc.SetFont(tf)
//以磅为单位设置字体大小
fc.SetFontSize(dtext.Size)
//设置剪裁矩形以进行绘制
fc.SetClip(rect)
//设置目标图像
fc.SetDst(dtext.PNG)
//设置绘制操作的源图像,通常为 image.Uniform
fc.SetSrc(image.NewUniform(color.RGBA{dtext.R, dtext.G, dtext.B, dtext.A}))
pt := freetype.Pt(x, y)
_, err := fc.DrawString(title, pt)
if err != nil {
return err
}
return nil
}
// Merge 合并到图片
func Merge(png draw.Image, merged *os.File) error {
err := jpeg.Encode(merged, png, nil)
if err != nil {
return err
}
return nil
}
// GetQRImage 获取二维码图像
func GetQRImage(url string, level qrcode.RecoveryLevel, size int) (image.Image, error) {
newQr, err := qrcode.New(url, level)
if err != nil {
return nil, err
}
qrImage := newQr.Image(size)
return qrImage, nil
}