图片添加水印。计划给博客的图片添加上水印。
当然,有部份内容在我的tools里 “github.com/soease/tools”
package main
import (
"flag"
"fmt"
"image"
"image/color"
"image/draw"
"io/ioutil"
"os"
"github.com/golang/freetype"
"github.com/soease/tools"
)
//发生错误时退出
func OnErrExit(err error) {
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
}
func main() {
var FontSize = flag.Float64("FontSize", 14, "字体大小")
var SourFile = flag.String("SourceFile", "", "源文件")
var WaterMark = flag.String("Water", "", "水印文件或水印字符串")
var DestFile = flag.String("DestFile", "", "生成水印文件")
var FontFile = flag.String("FontFile", "./simsun.ttc", "字体文件")
var LocationX = flag.Int("x", 0, "偏移位置x")
var LocationY = flag.Int("y", 0, "偏移位置y")
flag.Parse()
var WaterFile, WaterStr string
if len(os.Args) < 3 {
fmt.Println("\n 图片水印工具")
fmt.Println(" Tu Studio. Ease 2019\n")
flag.Usage()
os.Exit(-1)
}
if *SourFile == "" || tools.FileExist(*SourFile) == false {
fmt.Println("原文件不存在")
os.Exit(-1)
}
if tools.FileExist(*WaterMark) { //自动判断是字符串还是文件
WaterFile = *WaterMark
} else {
WaterStr = *WaterMark
}
SourImg, err := tools.PicFile_Img(*SourFile)
OnErrExit(err)
//---------------------------------------------------------------------------------------------------------------------图片水印
if WaterFile != "" {
wmb_img, err := tools.PicFile_Img(WaterFile)
OnErrExit(err)
//把水印写在右下角,并向0坐标偏移10个像素
offset := image.Pt(SourImg.Bounds().Dx()-wmb_img.Bounds().Dx()-10, SourImg.Bounds().Dy()-wmb_img.Bounds().Dy()-10)
b := SourImg.Bounds()
m := image.NewRGBA(b) //根据b画布的大小新建一个新图像
draw.Draw(m, b, SourImg, image.ZP, draw.Src)
draw.Draw(m, wmb_img.Bounds().Add(offset), wmb_img, image.ZP, draw.Over)
//生成新图片
if *DestFile == "" {
tools.WritePicFile(m, "./mark_"+*SourFile)
} else {
tools.WritePicFile(m, *DestFile)
}
}
//---------------------------------------------------------------------------------------------------------------------文字水印
if WaterStr != "" {
img := image.NewNRGBA(SourImg.Bounds())
for y := 0; y < img.Bounds().Dy(); y++ {
for x := 0; x < img.Bounds().Dx(); x++ {
img.Set(x, y, SourImg.At(x, y))
}
}
//拷贝一个字体文件到运行目录
fontBytes, err := ioutil.ReadFile(*FontFile)
OnErrExit(err)
font, err := freetype.ParseFont(fontBytes)
OnErrExit(err)
f := freetype.NewContext()
f.SetDPI(72)
f.SetFont(font)
f.SetFontSize(*FontSize)
f.SetClip(SourImg.Bounds())
f.SetDst(img)
f.SetSrc(image.NewUniform(color.RGBA{R: 0, G: 0, B: 0, A: 250}))
EnglishNum, ChineseNum := tools.EnglishNum_ChineseNum(WaterStr) //分别获取中文和英文数量
Size := ChineseNum*2 + EnglishNum //判断位置
pt := freetype.Pt(img.Bounds().Dx()-tools.Float64_Int(*FontSize/2)*Size-8-*LocationX, img.Bounds().Dy()-10-*LocationY)
_, err = f.DrawString(WaterStr, pt)
//再写一遍,形成阴影
f.SetSrc(image.NewUniform(color.RGBA{R: 250, G: 250, B: 250, A: 250}))
pt = freetype.Pt(img.Bounds().Dx()-tools.Float64_Int(*FontSize/2)*Size-10-*LocationX, img.Bounds().Dy()-12-*LocationY)
_, err = f.DrawString(WaterStr, pt)
//生成新图片
if *DestFile == "" {
tools.WritePicFile(img, "./mark_"+*SourFile)
} else {
tools.WritePicFile(img, *DestFile)
}
OnErrExit(err)
}
fmt.Println("添加水印图片结束请查看")
}