zoukankan      html  css  js  c++  java
  • 【Python】给图片添加水印的Python及Golang实现

    前言

    不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直接搜索URL也无效,无奈手动向百度提交了网址,一个多月后终于能搜到了。

    其实我是很愿意让别人看到自己写的东西的,虽然很多见解比较水,但是,作为见证自己成长的东西,不管是内容还是样式排版,都花了很多心思,而经恶意爬虫重新发表之后往往失去了原来的面貌,观感、可读性都会变差,甚至不能完全表达原来的意思。

    对于上面描述的这个事情我也和博客园官方沟通过--能不能为我们新发表的博客设置一个保护期,他们说当前没有找到有效的方法,如果一味的屏蔽爬虫可能会误伤搜索引擎的爬虫,所以结论是,我只能通过其他手段来完成权益的保护了。

    想到的的一个不是办法的办法就是给博客中的图片加水印了,在博客园的设置里面没有找到自动加上水印的功能,谷歌了一下也没有结果。

    大神说,学习编程最重要的就是不将就的思想,如果一件事情重复做了两遍以上,那么我们就应该想想,是不是有什么方法可以让我们不再重复。所以有了下面的代码。

    Python实现

    效果图

    参考代码

    下面这段代码是我使用Python实现的,给指定目录中的图片添加水印的代码,注释已经给的比较清晰,就不多做解释了

    #! /usr/bin/python
    # coding:utf-8 
    """ 
    @author:Bingo.he 
    @file: Watermark.py 
    @time: 2018/09/18 
    """
    import os
    from PIL import Image
    from PIL import ImageDraw
    from PIL import ImageFont
    
    def Watermark(fname, text):
        # 设置字体
        font = ImageFont.truetype("STLITI.TTF", 25)  # 不同的电脑可能不存在这里的字体,导致最后没有输出结果;如果你的电脑上没有这几种字体,请自行修改
    
        # 实例化图片对象
        imageFile = fname
        img = Image.open(imageFile).convert('RGBA')
        w, h = img.size  # 获取图片的宽、高
        font_time_size = w // 10
    
        draw = ImageDraw.Draw(img)
    
        # 设置文字位置/内容/颜色/字体,第一个参数可以调整系数调整相对位置,前者数字越大越靠左,后者数字越大越靠上,反之亦然
        draw.text((w - 350, h - font_time_size * 0.6), text=text, fill=(255, 152, 0), font=font)
    
        # 另存图片
        if not os.path.exists("marked"):
            os.mkdir("marked")
        img.save(os.path.join("marked", "{}_marked.png".format(fname.split(".")[0])))
    
    if __name__ == '__main__':
        # 因为jpg的图片不支持RGBA色域的定义,博主用png较多,markdown上传的图片也皆为png,所以暂未对其他格式最兼容
        text = "https://www.cnblogs.com/Detector/"
    
        # 取出需要加水印的文件信息
        files = os.listdir(".")
        pngs = [x for x in files if not os.path.isdir(x) and x.split(".")[1] == "png" and x.split(".")[0][-5:] != "marked"]  # 去除文件夹、非.png和以marked为图片结尾的文件
    
        for png in pngs:
            Watermark(png, text)
    

    Golang实现

    下面这段代码是使用Golang实现的,给指定目录中的图片添加水印的代码,使用的是在一张图片上直接贴上水印图片的方法,能避免背景色对水印的影响。

    效果图

    参考代码

    注释已经给的比较清晰,也不多做解释了

    package main
    
    import (
    	"fmt"
    	"image"
    	"image/draw"
    	"image/jpeg"
    	"image/png"
    	"os"
    )
    
    func main() {
    		// 原始图片
    	imgb, _ := os.Open("src.png")
    	img, _ := png.Decode(imgb)
    	defer imgb.Close()
    
    	// 水印图片
    	wmb, _ := os.Open("whiteMark.png")
    	watermark, _ := png.Decode(wmb)
    	defer wmb.Close()
    
    	// 把水印写到右下角,位置为原图减去水印图片的像素,并向0坐标各偏移10个像素
    	offset := image.Pt(img.Bounds().Dx()-watermark.Bounds().Dx()-10, img.Bounds().Dy()-watermark.Bounds().Dy()-10)
    	b := img.Bounds()
    	// 根据b画布的大小新建一个新图像
    	m := image.NewNRGBA(b)
    	// 分别在新的画布画这两张图
    	// image.ZP代表Point结构体,目标的源点,即(0,0)
    	// draw.Src源图像透过遮罩后,替换掉目标图像
    	// draw.Over源图像透过遮罩后,覆盖在目标图像上(类似图层)
    	draw.Draw(m, b, img, image.ZP, draw.Src)
    	draw.Draw(m, watermark.Bounds().Add(offset), watermark, image.ZP, draw.Over)
    
    	//生成新图片,并设置图片质量..
    	imgw, _ := os.Create("marked.jpg")
    	jpeg.Encode(imgw, m, &jpeg.Options{100})
    	defer imgw.Close()
    
    	fmt.Println("Done!")
    }
    

    参考资料:
    https://www.cnblogs.com/wuzhiblog/p/6535543.html
    https://www.cnblogs.com/christsong/p/5716287.html
    https://my.oschina.net/zituo/blog/138746?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com
    http://www.1025m.com/34.html

  • 相关阅读:
    re
    jieba
    Normalization的作用,LN,BN,WN
    RBF神经网络
    其他论文
    numpy, pandas,collections.Counter
    tensorflow 相关
    机器翻译(machine translation)相关
    2020 weblogin rce CVE-2020-14882 漏洞利用POC
    CVE-2021-3019 漏洞细节纰漏
  • 原文地址:https://www.cnblogs.com/Detector/p/9651699.html
Copyright © 2011-2022 走看看