在Python中使用PIL模块处理图像的教程


Posted in Python onApril 29, 2015

PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。
安装PIL

在Debian/Ubuntu Linux下直接通过apt安装:

$ sudo apt-get install python-imaging

Mac和其他版本的Linux可以直接使用easy_install或pip安装,安装前需要把编译环境装好:

$ sudo easy_install PIL

如果安装失败,根据提示先把缺失的包(比如openjpeg)装上。

Windows平台就去PIL官方网站下载exe安装包。
操作图像

来看看最常见的图像缩放操作,只需三四行代码:

import Image

# 打开一个jpg图像文件,注意路径要改成你自己的:
im = Image.open('/Users/michael/test.jpg')
# 获得图像尺寸:
w, h = im.size
# 缩放到50%:
im.thumbnail((w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('/Users/michael/thumbnail.jpg', 'jpeg')

其他功能如切片、旋转、滤镜、输出文字、调色板等一应俱全。

比如,模糊效果也只需几行代码:

import Image, ImageFilter

im = Image.open('/Users/michael/test.jpg')
im2 = im.filter(ImageFilter.BLUR)
im2.save('/Users/michael/blur.jpg', 'jpeg')

效果如下:

在Python中使用PIL模块处理图像的教程

PIL的ImageDraw提供了一系列绘图方法,让我们可以直接绘图。比如要生成字母验证码图片:

import Image, ImageDraw, ImageFont, ImageFilter
import random

# 随机字母:
def rndChar():
  return chr(random.randint(65, 90))

# 随机颜色1:
def rndColor():
  return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rndColor2():
  return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象:
font = ImageFont.truetype('Arial.ttf', 36)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
  for y in range(height):
    draw.point((x, y), fill=rndColor())
# 输出文字:
for t in range(4):
  draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg');

我们用随机颜色填充背景,再画上文字,最后对图像进行模糊,得到验证码图片如下:

在Python中使用PIL模块处理图像的教程

如果运行的时候报错:

IOError: cannot open resource

这是因为PIL无法定位到字体文件的位置,可以根据操作系统提供绝对路径,比如:

'/Library/Fonts/Arial.ttf'

要详细了解PIL的强大功能,请请参考PIL官方文档:

http://effbot.org/imagingbook/

Python 相关文章推荐
Python文件夹与文件的操作实现代码
Jul 13 Python
python有证书的加密解密实现方法
Nov 19 Python
Apache如何部署django项目
May 21 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Python将DataFrame的某一列作为index的方法
Apr 08 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
python实现图片素描效果
Sep 26 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 #Python
python创建和删除目录的方法
Apr 29 #Python
python访问系统环境变量的方法
Apr 29 #Python
python中迭代器(iterator)用法实例分析
Apr 29 #Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 #Python
python安装以及IDE的配置教程
Apr 29 #Python
python获取从命令行输入数字的方法
Apr 29 #Python
You might like
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
纯php生成随机密码
2015/10/30 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
Python实现测试磁盘性能的方法
2015/03/12 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
python模块smtplib学习
2018/05/22 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
AJAX的全称是什么
2012/11/06 面试题
医学生临床实习自我评价
2014/03/07 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
小学生通知书评语
2014/12/31 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS