在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中wx将图标显示在右下角的脚本代码
Mar 08 Python
python小技巧之批量抓取美女图片
Jun 06 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python算术运算符实例详解
May 31 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
php中用数组的方法设置cookies
2011/04/21 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
js实现旋转木马效果
2017/03/17 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
vue二级路由设置方法
2018/02/09 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
React优化子组件render的使用
2019/05/12 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
回调函数的意义以及python实现实例
2017/06/20 Python
python如何制作缩略图
2019/04/30 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
教师自我鉴定范文
2013/11/10 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
Python基础之元类详解
2021/04/29 Python