wartermark your image

lazymonkey posted @ 2012年5月21日 18:58 in 语言与设计 with tags 图像处理 python , 3552 阅读

《Windows网络程序设计》考试在几天前就结束了,第一次在试卷上写代码写到手痛,只能说考试很水很恶心!最近翻了一下zsh的文档,突然想自己写一个shell来玩一下,结果写了一点基本的东西(只完成了执行进程和信号控制)就写不下去了,总想着添加接口的问题,于是又去看lua(已是第二次!)、翻云风大神的Blog(很多都是看不懂的),决定还是应该深入了解一下lua。这些都是题外话,与主题无关!wheel...在这里图片在blog中是没有水印的,今天特意用python的PIL模块写了一个简陋的添加水印的脚本。PIL模块在很久之前就用过了,不过当时是拿来生成验证码,;-D。。。对于简单的图像处理来说,PIL足以应付了(虽然我更喜欢opencv ;)),只能感叹一下python的模块真的很管用!

PIL生成水印图像很简单,把你的水印添加到源图像来生成目标图像,一个简单例子:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import Image

source_img = Image.open('source.png')
logo_img = Image.open('logo.png')   # 要保证你的logo是透明的哟。。。废话!
source_img.paste(logo_img, (source_img.size[0] - logo_img.size[0],
                 source_img.size[1] - logo_img.size[1]), logo_img)
source_img.save('target.png', 'PNG')

看看效果:

这是源图像:

要添加的logo:

添加图像水印后:

还不错,继续pythonic,添加文字水印,也比较简单:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont

TEXT_FONT = "/home/lazymonkey/.fonts/Fabada-regular.ttf"     # 规定所使用的字体
FONT_SIZE = 14                                               # 设置14号字体
img       = Image.open('source.png')
text      = 'Hello world!'

watermark = Image.new("RGBA", (img.size[0], img.size[1]))
draw      = ImageDraw.ImageDraw(watermark, "RGBA")
font      = ImageFont.truetype(TEXT_FONT, FONT_SIZE)
draw.setfont(font)
draw.text((480, 560), text, 'Red')
img.paste(watermark, None, watermark)
img.save('target.png', 'PNG')

看看效果:

ok,封装一下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
'''

#                 {/ . .\}
#                 ( (oo)   )
#+--------------oOOo---︶︶︶︶---oOOo------------------+
#     FileName  :           wartermark.py
#     Describe  :           take wartermark to your image
#     Author    :           Lazy.monkey™
#     Email     :           lazymonkey.me@gmail.com
#     HomePage  :           lazymonkey.is-programmer.com
#     Version   :           0.0.1
#     LastChange:           2012-05-21 15:57:55
#+------------------------------------Oooo--------------+


'''
'''
Notes : 0. 请设定输出为png图片格式,以得到最佳效果
        1. 请设定字体为你系统内的字体
Usages: 0. python watermark.py source_img -l 'yourlogo' target_img
        1. python watermark.py source_img -t 'text you want' target_img
'''
from PIL import Image, ImageDraw, ImageFont
from math import atan, degrees
import sys
import os

TEXT_FONT = "/home/lazymonkey/.fonts/Fabada-regular.ttf"     # 规定所使用的字体
ALPHA     = True

def usage():
    if len(sys.argv) != 5:
        sys.exit("Usage: %s <options> <intput-image <text or logo> <output-image>"
                % os.path.basename(sys.argv[0]))

def logo4mark(filename, logo, outfilename):
    img      = Image.open(filename)
    logo_img = Image.open(logo)   # 要保证你的logo是透明的哟。。。废话!

    img.paste(logo_img, (img.size[0] - logo_img.size[0],
              img.size[1] - logo_img.size[1]), logo_img)
    img.save(outfilename)

def text4mark(filename, text, outfilename):
    img       = Image.open(filename).convert("RGB")
    watermark = Image.new("RGBA", (img.size[0], img.size[1]))
    draw      = ImageDraw.ImageDraw(watermark, "RGBA")
    font_size = 0
    ##
    # @brief 得到最佳字体大小
    while True:
        font_size += 1
        nextfont = ImageFont.truetype(TEXT_FONT, font_size)
        nexttextwidth, nexttextheight = nextfont.getsize(text)
        if nexttextwidth+nexttextheight/3 > watermark.size[0]:
            break
        font = nextfont
        textwidth, textheight = nexttextwidth, nexttextheight

    draw.setfont(font)
    draw.text(((watermark.size[0]-textwidth)/2,
               (watermark.size[1]-textheight)/2), text)
    watermark = watermark.rotate(degrees(atan(float(img.size[1])/
                                              img.size[0])),
                                 Image.BICUBIC)
    if ALPHA is True:   # 水印透明
        mask = watermark.convert("L").point(lambda x: min(x, 55))
    watermark.putalpha(mask)
    img.paste(watermark, None, watermark)
    img.save(outfilename)

if __name__ == "__main__":
    usage()
    if sys.argv[1] == '-l':
        logo4mark(*sys.argv[2:])
    if sys.argv[1] == '-t':
        text4mark(*sys.argv[2:])

看看透明文字水印的效果:

 

  • 无匹配
Avatar_small
依云 说:
2012年5月21日 19:23

为什么不试试 ImageMagick 呢?一行命令就能够解决哦亲~

Avatar_small
lazymonkey 说:
2012年5月21日 20:27

@依云: 果然,你赢了。。。我这是没事瞎折腾啊!重复造轮子咯。。。:(

Avatar_small
依云 说:
2012年5月21日 20:38

@lazymonkey: 喂,你就再去折腾下 ImageMagick 嘛,然后把最终的命令贴出来 ^_^

Avatar_small
lazymonkey 说:
2012年5月21日 20:47

@依云: 呃。。。ImageMagick做水印已经有人写了,我没机会啊!:-D http://tuxtweaks.com/2009/08/howto-watermark-images-imagemagick-linux/

Avatar_small
依云 说:
2012年5月21日 21:24

@lazymonkey: Thanks! 有时间研究下。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter