python图片加水印 - 小众知识

python图片加水印

2013年01月27日 14:18:05 苏内容
  标签: 水印/图片/python
阅读:7328

图片加“水印”的制作过程;我们经常会看见一些地图网站的地图切片上都有一个l;很明显吧!;这样logo是怎么加上去的呢?我就花了点时间在网;现在我就介绍下实现所谓“水印”的效果是什么样的一;一、Python环境的配置;Python环境配置很简单,若你安装了ArcGI;二、Logo的制作;Logo在这里我觉得只分为两种,一种是文字,另一;Logo


 
图片加“水印”的制作过程

我们经常会看见一些地图网站的地图切片上都有一个logo标志,例如下图上面就有一个标志,

 很明显吧!

这样logo是怎么加上去的呢?我就花了点时间在网上查了查资料,原来网上的方法很多,但是我更倾向使用Python来实现这个东西。Python脚本的优点在这里就不具体介绍了,虽然Python我会的只是点皮毛,但是解决些常规问题还是可以的。

现在我就介绍下实现所谓“水印”的效果是什么样的一个过程:在我具体操作之后,觉得整个过程分为3个部分

一、 Python环境的配置

Python环境配置很简单,若你安装了ArcGIS DeskTop,则只需要安装一个python包,PIL图片处理库,这个库对图片处理的功能很强大(The Python Imaging Library (PIL) allows you to create, modify, and convert image files in a wide variety of formats using the Python language.)。环境配置好了就可以进行下一步工作了。

二、 Logo的制作

Logo在这里我觉得只分为两种,一种是文字,另一种是图片。文字是指把文字直接加到图片上去,成为“水印”,而后者则是把图片加到图片上成为“水印”。在这里只介绍下图片类型,是因为好多很好看的Logo都是图文并茂的。

Logo制作,在这里我只在PS里试了下,主要注意几点,Logo必须PNG格式的图片,而且最好把Logo做的尺寸不要超过所加图片的尺寸,在这里我所加的图片都是256px*256px的,Logo大小为180px*30px(具体要这么做,只是减少程序里的复杂度),接下来就是PS里操作了,我就不具体说了,Logo如下图(PS水平有限,前面图标的背景轮廓没给除掉):

三、AddLogo.py的代码编写

Python脚本语言很有灵活性,但是它的格式也常会令生手头痛。因为它的语句缩进直接和语句运行顺序有关。有兴趣可以去看看Python脚本的基本语法,你就会明白了!

代码如下:(这些网上都有的,一些高人早就发到网上了,我只是综合整理且实际操作了下)

# -*- coding: utf-8 -*-

import Image, ImageEnhance #引用所需的库

POSITION = ('LEFTTOP','RIGHTTOP','CENTER','LEFTBOTTOM','RIGHTBOTTOM',"title","scale") #Logo的位置

PADDING = 10

MARKIMAGE = r'E:\学习\python\tt1.png' # Logo图片的位置

def reduce_opacity(im, opacity): # 处理Logo的透明度

assert opacity >= 0 and opacity <= 1

if im.mode != 'RGBA':

im = im.convert('RGBA')

else:

im = im.copy()

alpha = im.split()[3]

alpha = ImageEnhance.Brightness(alpha).enhance(opacity)

im.putalpha(alpha)

return im

def watermark(imagefile, markfile, position=POSITION[4], opacity=0.1):

im = Image.open(imagefile)

mark = Image.open(markfile)

if opacity < 1:

mark = reduce_opacity(mark, opacity)

if im.mode != 'RGBA':

im = im.convert('RGBA')

# 创建一个透明层,根据位置 来画Logo.

layer = Image.new('RGBA', im.size, (0,0,0,0))

if position == 'title':

for y in range(0, im.size[1], mark.size[1]):

for x in range(0, im.size[0], mark.size[0]):

layer.paste(mark, (x, y))

elif position == 'scale':

# scale, but preserve the aspect ratio

ratio = min(

float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])

w = int(mark.size[0] * ratio)

h = int(mark.size[1] * ratio)

mark = mark.resize((w, h))

layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2))

elif position == POSITION[0]:

#左上角

position = (PADDING,PADDING)

layer.paste(mark, position)

elif position == POSITION[1]:

#右上角

position = (im.size[0] - mark.size[0]-PADDING, PADDING)

layer.paste(mark, position)

elif position == POSITION[2]:

#中间

position = ((im.size[0] - mark.size[0])/2,(im.size[1] - mark.size[1])/2)

layer.paste(mark, position)

elif position == POSITION[3]:

#左下角

position = (PADDING,im.size[1] - mark.size[1]-PADDING,)

layer.paste(mark, position)

else:

#右上角

position = (im.size[0] - mark.size[0]-PADDING, im.size[1] - mark.size[1]-PADDING,) layer.paste(mark, position)

# 组合起来就可以啦

return Image.composite(layer, im, layer)

new_image_s_filename=r"E:\学习\python\test.png" # 要加水印的图片

watermark(new_image_s_filename,MARKIMAGE,POSITION[2],opacity=0.2).save(new_image_s_filename,quality=90)

双击运行AddLogo.py文件就可以了。效果如下图:

效果就是这样,至于和人家的效果有差别,很正常啊,因此,我们在logo制作上有待改进,logo美观和标志性,添加到图片上还要选择适当logo的透明度,这些都要考虑。

好了若你想把很多图片,例如咱们地图切片数据添加“水印”,就很方便了,在这基础上加个循环就OK啦,即使你有成千上万张图片都是小Case了,只要电脑实力够强大,你只要双击运行脚本程序,就把任务交给电脑来做了,它会很快的完成任务,而你就可以在这个时间中去打打篮球了!

我们都知道图片加“水印”主要是版权保护之举,目前这种方法倒是很实用,据我了解目前把水印加上去容易、若再把水印除掉就有点难了,这个过程可逆性难度很大(呵呵,其实一旦人家能获取这个Logo原始图,那就惨了,除去水印就有办法解决了,只是网上的全是PS具体操作,不是用程序来解决这个问题,所以大量的图片要除去水印,那工作量大的吓人啊!不过可能有技术能做到这点,只是我还不知道罢了)

!所以这种加了水印的地图数

据即使被别人Down去再拼起来使用,是大大费功夫的额!至于目前主流的“数字水印”技术,这个方法还不是一个等级上的概念,对“数字水印”技术有兴趣是可以去学习下的,毕竟学海无涯啊!

虽然这个做“水印”的方法早就不是什么难点,但是对于我,通过实际学习,收获很多啊!学海当中,高人无数,只要我们时刻保持拥有一颗对学习充满热情的心,就会在学习知识的道路上获取无尽的快乐,为工作做好坚实的基础!

扩展阅读