在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文档生成工具pydoc使用介绍
Jun 02 Python
python爬虫爬取网页表格数据
Mar 07 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
在python里面运用多继承方法详解
Jul 01 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
python中的django是做什么的
Jul 31 Python
python 如何在list中找Topk的数值和索引
May 20 Python
django中websocket的具体使用
Jan 22 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
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
初学Python函数的笔记整理
2015/04/07 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python列表list保留顺序去重的实例
2018/12/14 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
简单了解python关系(比较)运算符
2019/07/08 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
美国校园市场:OCM
2017/06/08 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
教师节慰问信
2015/02/15 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
Python保存并浏览用户的历史记录
2022/04/29 Python