Python练习册--PIL处理图片之加水印

背景

最近在看到了Python 练习册,每天一个小程序 这个项目,非常有趣,也比较实用.

晚上看了这第000题,关于Python图片处理:

将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

之前没怎么使用过PIL库,在生成验证码及识别验证码时也需要了解这方面知识,就动手试了实践下.


PIL

The Python Imaging Library adds image processing capabilities to your Python interpreter. 这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。

文档在这:http://omz-software.com/pythonista/docs/ios/PIL.html

思路

题目的意思实际就是为图片加水印,具体可分以下2步:

  1. 将文本"转"成图片
  2. 将生成的水印图片跟原图相"叠加"

原理差不多就是这样子,具体处理还得使用PIL.



最后贴上代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2014-11-29 19:09:59
# @Author  : Linsir ([email protected])
# @Link    : http://Linsir.sinaapp.com

import Image, ImageEnhance, ImageDraw, ImageFont

def text2img(text, font_color="Blue", font_size=25):
    """生成内容为 TEXT 的水印"""

    font = ImageFont.truetype(‘simsun.ttc‘, font_size)
    #多行文字处理
    text = text.split(‘\n‘)
    mark_width = 0
    for  i in range(len(text)):
        (width, height) = font.getsize(text[i])
        if mark_width < width:
            mark_width = width
    mark_height = height * len(text)

    #生成水印图片
    mark = Image.new(‘RGBA‘, (mark_width,mark_height))
    draw = ImageDraw.ImageDraw(mark, "RGBA")
    draw.setfont(font)
    for i in range(len(text)):
        (width, height) = font.getsize(text[i])
        draw.text((0, i*height), text[i], fill=font_color)
    return mark

def set_opacity(im, opacity):
    """设置透明度"""

    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(im, mark, position, opacity=1):
    """添加水印"""

    try:
        if opacity < 1:
            mark = set_opacity(mark, opacity)
        if im.mode != ‘RGBA‘:
            im = im.convert(‘RGBA‘)
        if im.size[0] < mark.size[0] or im.size[1] < mark.size[1]:
            print "The mark image size is larger size than original image file."
            return False

        #设置水印位置
        if position == ‘left_top‘:
            x = 0
            y = 0
        elif position == ‘left_bottom‘:
            x = 0
            y = im.size[1] - mark.size[1]
        elif position == ‘right_top‘:
            x = im.size[0] - mark.size[0]
            y = 0
        elif position == ‘right_bottom‘:
            x = im.size[0] - mark.size[0]
            y = im.size[1] - mark.size[1]
        else:
            x = (im.size[0] - mark.size[0]) / 2
            y = (im.size[1] - mark.size[1]) / 2

        layer =Image.new(‘RGBA‘, im.size,)
        layer.paste(mark,(x,y))returnImage.composite(layer, im, layer)exceptExceptionas e:print">>>>>>>>>>> WaterMark EXCEPTION:  "+ str(e)returnFalsedef main():
    text = u‘Linsir.水印.\[email protected]‘# text = open(‘README.md‘).read().decode(‘utf-8‘)# print text
    im =Image.open(‘origal.png‘)
    mark = text2img(text)
    image = watermark(im, mark,‘center‘,0.9)if image:
        image.save(‘watermark.png‘)
        image.show()else:print"Sorry, Failed."if __name__ ==‘__main__‘:
    main()

其实会了这些代码,也就可以做些像: python生成图片验证码10 行代码判定色图片,PYTHON生成图片,生成长微博之类的事了.

enjoy it .

时间: 2024-08-02 07:00:00

Python练习册--PIL处理图片之加水印的相关文章

python opencv加水印 去水印

收到的需求是在一个图上匹配到水印 然后将原来的水印换成一个新水印 先要安装一个库 库文件代码如下: # coding=utf-8 import cv2 import numpy as np # 膨胀算法 Kernel _DILATE_KERNEL = np.array([[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]], dtype=np.uint8) class Waterm

ASP组件AspJpeg(加水印)生成缩略图等使用方法

ASP组件AspJpeg(加水印)生成缩略图等使用方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-12-17我要评论 ASPJPEG是一款功能相当强大的图象处理组件,用它可以轻松地做出图片的缩略图和为图片加上水印功能.下面简单介绍一下使用方法,需要的朋友可以了解下 一.为图片添加水印 复制代码 代码如下: <% Dim Jpeg ''''//声明变量 Set Jpeg = Server.CreateObject("Persits.Jpeg") ''''//调用组件

Python练习册,每天一个小程序

Python练习册,每天一个小程序 精选评论关注该公众号可参与评论 写评论 加载中 以上评论由公众帐号筛选后显示 Python练习册,每天一个小程序 提交 我的评论 已评论 Python练习册,每天一个小程序 2014-12-15 程序猿 说明: ●Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也试用 ●不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 ●欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) ●访问链接h

20170511 Python练习册0000 将头像右上角加上红色的数字

现在开始每天做一个Python小练习,第一个练习 #!/usr/bin/env python#-*- coding:utf8 -*-from PIL import Image, ImageDraw, ImageFontdef add_num(img): draw = ImageDraw.Draw(img)#创建一个可用来对img进行操作的对象,即创建绘画对象 myfont = ImageFont.truetype('C:/windows/fonts/Arial.ttf', size=40)#加载

学习笔记-php图像加水印组合图像简单完美剪裁-2016.4.7

<?php/** * Created by PhpStorm. * User: 兰小宇 * Date: 2016/3/30 * Time: 23:08 *///图像处理类class Image{ private $file; //图像地址 private $width; //获取图像的宽度 private $height; //获取图像的高度 private $type; //获取图像的类型 private $img; //原来图像的资源句柄 private $new; //新的资源句柄 //构

PIL Python Imaging Library (PIL)

介绍 把Python的基础知识学习后,尝试一下如何安装.加载.使用非标准库,选择了图像处理模块PIL. Python Imaging Library (PIL)是PythonWare公司提供的免费的图像处理工具包,是python下的图像处理模块,支持多种格式,并提供强大的图形与图像处理功能.虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发.对于简单的图像处理或者大批量的简单图像处理任务,

光影魔术手怎么加水印?光影魔术手加水印教程

大家光影魔术手是一款经典的照片美化软件,它处理图片非常好用而且方便,那怎么用光影魔术手加水印呢?也就是光影魔术手加水印的教程,大家看下我的制作方法,很简单方便,希望可以帮到大家处理图片哦!第一步:先打开光影魔术手 第二步:然后选择一张你要加水印的图片,在软件的右上角找到"加水印",然后点击添加 第三步:点击添加以后就会要你选择文件,你找到你要加水印图片的文件夹,找到要加水印 第四步:添加进来后,在后边的区域对水印进行调节,(可以调节大小,图片的样式,旋转的角度,已经透明度) 第五步:调

Python中的PIL

转自:http://blog.csdn.net/yockie/article/details/8498301 介绍 把Python的基础知识学习后,尝试一下如何安装.加载.使用非标准库,选择了图像处理模块PIL. Python Imaging Library (PIL)是PythonWare公司提供的免费的图像处理工具包,是python下的图像处理模块,支持多种格式,并提供强大的图形与图像处理功能.虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开

Python练习册0-9

Python练习册0-9 By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 这段时间在家做了点Python练习册里的题目,里面的题目都不是很难,但是做起来还是要费点时间的,适合熟悉python的使用.这里先给出前十道题的解答思路和代码. 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 思路:利用Python的PIL模块,PIL模块提供了图片生成,图片绘制等方法.