在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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python字符串逐字符或逐词反转方法
May 21 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
用tensorflow搭建CNN的方法
Mar 05 Python
Python3实现二叉树的最大深度
Sep 30 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
如何通过python实现人脸识别验证
Jan 17 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
Python实现随机生成迷宫并自动寻路
Jun 13 Python
Python中Selenium对Cookie的操作方法
Jul 09 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中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
jQuery插件Validation表单验证详解
2018/05/26 jQuery
node使用request请求的方法
2019/12/20 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
python操作xml文件示例
2014/04/07 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
Python基于select实现的socket服务器
2016/04/13 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python实现大文本文件分割
2019/07/22 Python
Python笔记之观察者模式
2019/11/20 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
详解anaconda安装步骤
2020/11/23 Python
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
《湘夫人》教学反思
2014/02/21 职场文书
工作决心书范文
2014/03/11 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
优秀团员自我评价
2015/03/10 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android