(原) Go给图片添加水印

原创文章,请后转载,并注明出处。

图片添加水印。计划给博客的图片添加上水印。

当然,有部份内容在我的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("添加水印图片结束请查看")
}

相关文章