前言

不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直接搜索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

【Python】给图片添加水印的Python及Golang实现的更多相关文章

  1. Python Windows 快捷键自动给剪贴板(复制)图片添加水印

    编写一个能在windows上使用的按下快捷键自动给剪贴板(复制)的图片添加水印的小工具.plyer.PIL.pyinstaller.pynput.win32clipboard库.记录自己踩过的坑,部分 ...

  2. Python提取图片的ROI

    图像处理经常需要提取图片的ROI,本文使用Python提取图片的ROI. 使用的Module是PIL (Pillow),一个图像处理库,用到的函数为类 Image 中的 crop 方法. 函数原型为: ...

  3. python 读取图片的尺寸、分辨率

    #需要安装PIL模块 #encoding=gbk#--------------------------------------------------------------------------- ...

  4. python 对比图片相似度

    最近appium的使用越来越广泛了,对于测试本身而言,断言同样是很重要的,没有准确的断言那么就根本就不能称之为完整的测试了.那么目前先从最简单的截图对比来看.我这里分享下python的图片相似度的代码 ...

  5. 从url下载图片--java与python实现方式比较

    从url下载图片--java与python实现方式比较 博客分类: 技术笔记小点滴 javapython图片下载  一.java的实现方式 首先读取图片 //方式一:直接根据url读取图片 priva ...

  6. Python 将图片转化为 HTML 页面

    最近在 GitHub 看到一个挺有意思的 Python 程序(img2html: Convert a image to HTML). 它能将图片的每个像素用文字代替,最后生成一个HTML文档,在浏览器 ...

  7. python在图片上画矩形

    python在图片上画矩形 image_path = '' image = cv2.imread(image_path) first_point = (100, 100) last_point = ( ...

  8. Python读取图片尺寸、图片格式

    Python读取图片尺寸.图片格式 需要用到PIL模块,使用pip安装Pillow.Pillow是从PIL fork过来的Python 图片库. from PIL import Image im = ...

  9. Python下图片的高斯模糊化的优化

    资源下载 #本文PDF版下载 Python下图片的高斯模糊化的优化(或者单击我博客园右上角的github小标,找到lab102的W6目录下即可) #本文代码下载 高斯模糊(一维)优化代码(和本文方法集 ...

随机推荐

  1. workerman定时任务使用

      定时任务在有些场合很实用,像淘宝的自动确认收货就必须放在服务端进行,这时workeran的定时任务就派上用场了,它可以支持毫秒,crontab的粒度是一分钟 需要注意的是因为定时任务一直在执行,业 ...

  2. #C++初学记录(sort函数)

    sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...

  3. Object-C-NSDictionary

    存储对象都必须是id(对象类型)不能使基础类型 NSDictionary *scores=[[NSDictionary alloc]initWithObjectsAndKeys:@"89&q ...

  4. Hive四种数据导入方式介绍

    问题导读 1.从本地文件系统中通过什么命令可导入数据到Hive表? 2.什么是动态分区插入? 3.该如何实现动态分区插入? 扩展: 这里可以和Hive中的三种不同的数据导出方式介绍进行对比? Hive ...

  5. python 文件操作 练习:取得文件的最后存取时间

    #coding=utf-8 import osimport time file_atime=int(os.path.getatime('d:\\a.txt'))print "file_ati ...

  6. Linux基础命令---bzmore

    bzmore 将bzip压缩过的文件解压到标准输出,同时也可以将普通文件显示到标准输出.该指令可以实现分屏显示,并且不会删除压缩包.bzmore是一个过滤器,它允许在软拷贝终端上一次检查压缩或纯文本文 ...

  7. MySQL数据库----多表查询

    一.介绍 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( ...

  8. Mysql优化_内置profiling性能分析工具

    如果要进行SQL的调优优化和排查,第一步是先让故障重现,但是这个并不是这一分钟有问题,下一秒就OK.一般的企业一般是DBA数据库工程师从监控里找到问题.DBA会告诉我们让我们来排查问题,那么可能很多种 ...

  9. 逆向与BOF基础——注入shellcode并执行&Return-to-libc

    逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...

  10. 使用qmlscene预览qml文件

    功能:可以预览qml文件的界面 使用:qmlscene myapp.qml