package main

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "io/ioutil"
    "os"

    "github.com/golang/freetype"
)

// 创建宽 500 高 300 的图片
const (
    w = 500
    h = 300
)

func main() {

    //返回一个矩形
    rectangle := image.Rect(0, 0, w, h)
    rgba := image.NewRGBA(rectangle)
    // 设置一条白色的斜线
    for y := 0; y < h; y++ {
        rgba.Set(y, y, color.RGBA{255, 255, 255, 1})
    }
    // 文字水印
    fontbyte, err := ioutil.ReadFile("./simhei.ttf")
    if err != nil {
        fmt.Println("ioutil.ReadFile error : ", err)
        return
    }
    font, err := freetype.ParseFont(fontbyte)
    if err != nil {
        fmt.Println("freetype.ParseFont error : ", err)
        return
    }
    // 创建一个新的上下文
    context := freetype.NewContext()
    context.SetDPI(70)                                             // 设置屏幕分辨率,单位为每英寸点数。
    context.SetClip(rgba.Bounds())                                 //设置用于绘制的剪辑矩形。
    context.SetDst(rgba)                                           //设置绘制操作的目标图像。
    context.SetFont(font)                                          //设置用于绘制文本的字体。
    context.SetFontSize(16)                                        //以点为单位设置字体大小(如“12点字体”)。
    context.SetSrc(image.NewUniform(color.RGBA{255, 255, 255, 1})) //设置用于绘制操作的源图像
    pt := freetype.Pt(10, 260)                                     //从一个以像素度量的坐标对转换为一个固定的点
    context.DrawString("文字水印", pt)
    // 图片水印
    img, _ := os.Open("./img.jpg")
    defer img.Close()
    img1, _ := jpeg.Decode(img) //读取一个JPEG图像并将其作为image.Image返回
    offset := image.Pt(300, 10)
    draw.Draw(rgba, img1.Bounds().Add(offset), img1, image.ZP, draw.Over)

    //创建图片
    file, err := os.Create("./text.jpg")
    if err != nil {
        fmt.Println("os.Open error : ", err)
        return
    }
    // 将图像写入file
    //&jpeg.Options{100} 取值范围[1,100],越大图像编码质量越高
    jpeg.Encode(file, rgba, &jpeg.Options{100})
    defer file.Close()
}

 效果: