用go语言写个生成图片的功能,可以在图片的中间插入一个文本,文本支持微软雅黑字体,也支持文本颜色控制
时间: 2024-02-27 22:53:02 浏览: 133
kivy中文支持全局替换微软雅黑替换字体.rar
5星 · 资源好评率100%
好的,请参考以下代码实现:
```go
package main
import (
"bytes"
"fmt"
"image"
"image/color"
"image/draw"
"image/jpeg"
"io/ioutil"
"log"
"net/http"
"path/filepath"
"github.com/golang/freetype"
"github.com/golang/freetype/truetype"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
text := "Hello, world!" // 要插入图片中间的文本
fontPath := "msyh.ttc" // 字体文件路径
fontSize := 48.0 // 字体大小
textColor := "#FF0000" // 文本颜色
// 读取字体文件
fontBytes, err := ioutil.ReadFile(fontPath)
if err != nil {
log.Fatal(err)
}
// 解析字体文件
font, err := freetype.ParseFont(fontBytes)
if err != nil {
log.Fatal(err)
}
// 创建画布
canvas := image.NewRGBA(image.Rect(0, 0, 640, 480))
// 绘制背景色
draw.Draw(canvas, canvas.Bounds(), image.NewUniform(color.White), image.Point{}, draw.Src)
// 创建文本绘制器
context := freetype.NewContext()
context.SetDPI(72)
context.SetFont(font)
context.SetFontSize(fontSize)
context.SetClip(canvas.Bounds())
context.SetDst(canvas)
context.SetSrc(image.NewUniform(parseHexColor(textColor)))
// 计算文本位置
textWidth := context.PointToFixed(len(text)*int(fontSize/2)) >> 6
textHeight := context.PointToFixed(fontSize) >> 6
textX := (canvas.Bounds().Max.X - textWidth) / 2
textY := (canvas.Bounds().Max.Y - textHeight) / 2
// 绘制文本
pt := freetype.Pt(textX, textY)
_, err = context.DrawString(text, pt)
if err != nil {
log.Fatal(err)
}
// 保存图片
savePath := "output.jpg"
err = saveImage(canvas, savePath)
if err != nil {
log.Fatal(err)
}
// 输出图片
w.Header().Set("Content-Type", "image/jpeg")
http.ServeFile(w, r, savePath)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
// 将十六进制颜色字符串解析为颜色对象
func parseHexColor(hex string) color.Color {
var c color.RGBA
c.A = 0xff
fmt.Sscanf(hex, "#%02x%02x%02x", &c.R, &c.G, &c.B)
return c
}
// 保存图片到文件
func saveImage(img image.Image, path string) error {
f, err := os.Create(path)
if err != nil {
return err
}
defer f.Close()
var buf bytes.Buffer
err = jpeg.Encode(&buf, img, nil)
if err != nil {
return err
}
_, err = f.Write(buf.Bytes())
if err != nil {
return err
}
return nil
}
```
以上代码使用了 Go 语言的标准库和 freetype 库来生成图片,并将生成的图片输出到 HTTP 响应中。在代码中,使用了 `image.NewRGBA()` 函数创建了一个 RGBA 类型的画布,然后使用 `freetype` 库中的 `NewContext()` 函数来创建文本绘制器,计算文本位置,并绘制文本。最后,使用 `jpeg.Encode()` 函数将画布保存为 JPEG 格式的图片,并输出到 HTTP 响应中。代码中也提供了一个 `saveImage()` 函数,可以将图片保存到文件。
阅读全文