Python图像处理库PIL的ImageDraw模块介绍详解


Posted in Python onFebruary 26, 2020

ImageDraw模块提供了图像对象的简单2D绘制。用户可以使用这个模块创建新的图像,注释或润饰已存在图像,为web应用实时产生各种图形。

PIL中一个更高级绘图库见The aggdraw Module

一、ImageDraw模块的概念

1、  Coordinates

绘图接口使用和PIL一样的坐标系统,即(0,0)为左上角。

2、  Colours

为了指定颜色,用户可以使用数字或者元组,对应用户使用函数Image.new或者Image.putpixel。对于模式为“1”,“L”和“I”的图像,使用整数。对于“RGB”图像,使用整数组成的3元组。对于“F”图像,使用整数或者浮点数。

对于调色板图像(模式为“P”),使用整数作为颜色索引。在1.1.4及其以后,用户也可以使用RGB 3元组或者颜色名称。绘制层将自动分配颜色索引,只要用户不绘制多于256种颜色。

3、  Colours Names

在PIL 1.1.4及其以后的版本,用户绘制“RGB”图像时,可以使用字符串常量。PIL支持如下字符串格式:

A、 十六进制颜色说明符,定义为“#rgb”或者“#rrggbb”。例如,“#ff0000”表示纯红色。

B、 RGB函数,定义为“rgb(red, green, blue)”,变量red、green、blue的取值为[0,255]之间的整数。另外,颜色值也可以为[0%,100%]之间的三个百分比。例如,“rgb(255, 0, 0)”和“rgb(100%, 0%, 0%)”都表示纯红色。

C、 HSL(Hue-Saturation-Lightness)函数,定义为“hsl(hue,saturation%, lightness%)”,变量hue为[0,360]一个角度表示颜色(red=0, green=120, blue=240),变量saturation为[0%,100%]之间的一个值(gray=0%,full color=100%),变量lightness为[0%,100%]之间的一个值(black=0%, normal=50%, white=100%)。例如,“hsl(0,100%, 50%)”为纯红色。

D、 通用HTML颜色名称,ImageDraw模块提供了140个标准颜色名称,Xwindow系统和大多数web浏览器都支持这些颜色。颜色名称对大小写不敏感。例如,“red”和“Red”都表示纯红色。

4、  Fonts

PIL可以使用bitmap字体或者OpenType/TrueType字体。

Bitmap字体被存储在PIL自己的格式中,它一般包括两个文件,一个叫.pil,它包含字体的矩阵,另一个通常叫做.pbm,它包含栅格数据。

在ImageFont模块中,使用函数load()加载一个bitmap字体。

在ImageFont模块中,使用函数truetype()加载一个OpenType/TrueType字体。注意:这个函数依赖于第三方库,而且并不是在所有的PIL版本中都有效。

(IronPIL)加载内置的字体,使用ImageFont模块的Font()结构函数即可。

二、ImageDraw模块的函数

1、  Draw

定义:Draw(image) ⇒ Draw instance

含义:创建一个可以在给定图像上绘图的对象。

(IronPIL)用户可以使用ImageWin模块的HWND或者HDC对象来代替图像。这个允许用户直接在屏幕上绘图。

注意:图像内容将会被修改。

例子:

>>> fromPIL import Image, ImageDraw

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> draw =ImageDraw.Draw(im01)

>>> draw.line((0,0) +im01.size, fill=128)

>>> draw.line((0,im01.size[1], im.size[0], 0), fill = 128)

>>> im01.show()

>>> del draw

在图像01上绘制了两条灰色的对角线,如下图:

Python图像处理库PIL的ImageDraw模块介绍详解                            

三、ImageDraw模块的方法

1、  Arc

定义:draw.arc(xy, start, end, options)

含义:在给定的区域内,在开始和结束角度之间绘制一条弧(圆的一部分)。

变量options中fill设置弧的颜色。

例子:

>>> from PIL import Image,ImageDraw
>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> draw =ImageDraw.Draw(im01)
>>> draw.arc((0,0,200,200),0, 90, fill = (255,0,0))
>>>draw.arc((300,300,500,500), 0, -90, fill = (0,255,0))
>>> draw.arc((200,200,300,300),-90, 0, fill = (0,0,255))
>>> im01.show()
>>> del draw

注意:变量xy是需要设置一个区域,此处使用4元组,包含了区域的左上角和右下角两个点的坐标。此PIL版本中,变量options不能使用outline,会报错:“TypeError: arc() got an unexpected keyword argument 'outline'”;所以此处应该使用fill。

在图像01上(0,0,200,200)区域使用红色绘制了90度的弧,(300,300,500,500)区域使用绿色绘制了270度的弧,(200,200,300,300)区域使用蓝色绘制了90度的弧。这些弧都是按照顺时针方向绘制的。变量start/end的0度为水平向右,沿着顺时针方向依次增加。绘制后的图像01如下图:

Python图像处理库PIL的ImageDraw模块介绍详解

2、  Bitmap

定义:draw.bitmap(xy, bitmap, options)

含义:在给定的区域里绘制变量bitmap所对应的位图,非零部分使用变量options中fill的值来填充。变量bitmap位图应该是一个有效的透明模板(模式为“1”)或者蒙版(模式为“L”或者“RGBA”)。

这个方法与Image.paste(xy, color, bitmap)有相同的功能。

例子:

>>> from PIL import Image,ImageDraw

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")

>>> im =im02.resize(300,200)>>> im.size

(300, 200)

>>> r,g,b =im.split()

>>> draw =ImageDraw.Draw(im01)

>>>draw.bitmap((0,0), r, fill = (255,0,0))

>>>draw.bitmap((300,200), g, fill = (0,255,0))

>>>draw.bitmap((600,400), b, fill = (0,0,255))

>>> im01.show()

变量xy是变量bitmap对应位图起始的坐标值,而不是一个区域。

图像im01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

3、  Chord

定义:draw.chord(xy,start, end, options)

含义:和方法arc()一样,但是使用直线连接起始点。

变量options的outline给定弦轮廓的颜色。Fill给定弦内部的颜色。

例子:

>>>from PIL import Image, ImageDraw
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> draw =ImageDraw.Draw(im01)
>>> draw.chord((0,0,200,200),0, 90, fill = (255,0,0))
>>> draw.chord((300,300,500,500), 0, -90, fill = (0,255,0))
>>> draw.chord((200,200,300,300), -90, 0, fill = (0,0,255))
>>> im01.show()

图像im01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

4、  Ellipse

定义:draw.ellipse(xy,options)

含义:在给定的区域绘制一个椭圆形。

变量options的outline给定椭圆形轮廓的颜色。Fill给定椭圆形内部的颜色。

例子:

>>>from PIL import Image, ImageDraw
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> draw =ImageDraw.Draw(im01)
>>> draw.ellipse((0,0, 200, 200), fill = (255, 0, 0))
>>> draw.ellipse((200,200,400,300),fill = (0, 255, 0))
>>>draw.ellipse((400,400,800,600), fill = (0, 0, 255))
>>> im01.show()

图像im01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

5、  Line

定义:draw.line(xy,options)

含义:在变量xy列表所表示的坐标之间画线。

坐标列表可以是任何包含2元组[(x,y),…]或者数字[x,y,…]的序列对象。它至少包括两个坐标。

变量options的fill给定线的颜色。

(New in 1.1.5)变量options的width给定线的宽度。注意线连接不是很好,所以多段线段连接不好看。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.line([(0,0),(100,300),(200,500)], fill = (255,0,0), width = 5)

>>>draw.line([50,10,100,200,400,300], fill = (0,255,0), width = 10)

>>>im01.show()

图像im01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

6、  Pieslice

定义:draw.pieslice(xy,start, end, options)

含义:和方法arc()一样,但是在指定区域内结束点和中心点之间绘制直线。

变量options的fill给定pieslice内部的颜色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.pieslice((0,0,100,200), 0, 90, fill = (255,0,0))

>>>draw.pieslice((100,200,300,400), 0, -90, fill = (0,255,0))

>>> im01.show()

图像im01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

7、  Point

定义:draw.point(xy,options)

含义:在给定的坐标点上画一些点。

坐标列表是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象。

变量options的fill给定点的颜色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.point([(0,0),(100,150), (110, 50)], fill = (255, 0, 0))

>>> draw.point([0,10,100,110, 210, 150], fill = (0, 255, 0))

>>>im01.show()

图像im01上在对应的坐标点上会有红色/绿色的点,每个点只占一个像素点。图像如下:

Python图像处理库PIL的ImageDraw模块介绍详解

8、  Polygon

定义:draw.polygon(xy,options)

含义:绘制一个多边形。

多边形轮廓由给定坐标之间的直线组成,在最后一个坐标和第一个坐标间增加了一条直线,形成多边形。

坐标列表是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象。它最少包括3个坐标值。

变量options的fill给定多边形内部的颜色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.polygon([(0,0),(100,150), (210, 350)], fill = (255, 0, 0))

>>> draw.polygon([300,300,100,400, 400, 400], fill = (0, 255, 0))

>>>im01.show()

图像01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

9、  Rectangle

定义:draw.rectangle(box,options)

含义:绘制一个长边形。

变量box是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象。它应该包括2个坐标值。

注意:当长方形没有没有被填充时,第二个坐标对定义了一个长方形外面的点。

变量options的fill给定长边形内部的颜色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.rectangle((0,0,100,200), fill = (255,0,0))

>>> draw.rectangle([100,200,300,500],fill = (0,255,0))

>>>draw.rectangle([(300,500),(600,700)], fill = (0,0,255))

>>>im01.show()

图像01如下:

Python图像处理库PIL的ImageDraw模块介绍详解

10、Text

定义:draw.text(position,string, options)

含义:在给定的位置绘制一个字符创。变量position给出了文本的左上角的位置。

变量option的font用于指定所用字体。它应该是类ImangFont的一个实例,使用ImageFont模块的load()方法从文件中加载的。

变量options的fill给定文本的颜色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.text((0,0),"Hello", fill = (255,0,0))

>>>im01.show()

在图像01的(0,0)位置绘制出字符串“Hello”。

11、 Textsize

定义:draw.textsize(string,options)⇒ (width, height)

含义:返回给定字符串的大小,以像素为单位。

变量option的font用于指定所用字体。它应该是类ImangFont的一个实例,使用ImageFont模块的load()方法从文件中加载的。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.textsize("Hello")

(30, 11)

>>>draw.textsize("Hello, the world")

(96, 11)

>>>im01.show()

四、ImageDraw模块的option变量

Option变量有三个属性,分别为outline,fill和font。Outline和fill都可为整数或者元组;font为ImageFont类的实例。

这几个属性在前面方法介绍中都有用到,这里不作解释。

五、ImageDraw模块的兼容性

类Draw包括的一个构造函数和一些方法提供向后兼容。为了使这些函数正常工作,用户应该使用options,或者使用这些方法。但不能混合旧的和新的调用习惯。

(IronPIL)IronPIL不支持这些有兼容性的方法。

1、  ImageDraw

定义:ImageDraw(image)⇒ Draw instance

含义:(不赞成)生成Draw的实例。新代码中不要用这个函数。

2、  Setink

定义:draw.setink(ink)

含义:(不赞成)为后续绘制和fill属性设置颜色。

3、   Setfill

定义:draw.setfill(mode)

含义:(不赞成)设置fill属性。

如果变量mode为0,后续绘制的形状(像多边形和长方形)都是轮廓。如果mode为1,则它们会被填充。

4、  Setfill

定义:draw.setfont(font)

含义:(不赞成)为text()方法设置默认的字体。

变量font是ImageFont类的实例,使用ImageFont模块的load()方法从文件中加载的。

五、ImageDraw示例

首先创建一个图片或者打开一个图片

blank = Image.new("RGB",[1024,768],"white")

创建一个可用来Image操作的对象(必须)

drawObj = ImageDraw.Draw(blank)

直线

# 创建一个正方形。 [x1,x2,y1,y2]或者[(x1,x2),(y1,y2)] fill代表的为颜色
drawObj.line([100,100,100,600],fill='red')
drawObj.line([100,100,600,100],fill='red')
drawObj.line([600,100,600,600],'black')
drawObj.line([100,600,600,600],'red')
# blank.save('white.jpg','jpeg')

弧线

# 弧形 [x1,x2,y1,y2] 弧度 颜色
drawObj.arc([100,100,600,600],0,360,fill='black')
drawObj.arc([200,100,500,600],0,360,fill='red')
blank.save('black.jpg','jpeg')

# 画圆 [x1,x2,y1,y2] outline边框颜色 fill填充颜色
drawObj.ellipse([100,100,600,600],outline='black',fill='white')
blank.save('black.jpg','jpeg')

半圆

# 画半圆 [x1,x2,y1,y2] 弧度 outline弦线颜色 fill填充颜色
drawObj.chord([100,100,600,600],0,360,outline=125)
drawObj.chord([100,100,600,600],0,90,outline=158)
drawObj.chord([100,100,600,600],90,180,outline=99,fill='red')
blank.save('black.jpg','jpeg')

扇形

# 扇形 [x1,x2,y1,y2] 弧度 outline弦线颜色 fill填充颜色
drawObj.pieslice([100,100,600,600],180,210,outline=255)
drawObj.pieslice([100,100,600,600],30,80,fill=255)
blank.save('black.jpg','jpeg')

多边形

# 多边形
drawObj.polygon([10,23,45,6,77,87],outline='red')
drawObj.polygon([10,20,30,40,50,90,70,80,90,100],fill='red')
blank.save('black.jpg','jpeg')

矩形

# 矩形
drawObj.rectangle((200,200,500,500),outline = "red")
drawObj.rectangle((250,300,450,400),fill = 128)
blank.save('black.jpg','jpeg')

到此这篇关于Python图像处理库PIL的ImageDraw模块介绍详解的文章就介绍到这了,更多相关PIL ImageDraw模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
Numpy的简单用法小结
Aug 28 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
python3 hdf5文件 遍历代码
May 19 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 #Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 #Python
python实现银行实战系统
Feb 26 #Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 #Python
python序列类型种类详解
Feb 26 #Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 #Python
Python中if有多个条件处理方法
Feb 26 #Python
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
关于Intype一些小问题的解决办法
2008/03/28 PHP
PHP中用hash实现的数组
2011/07/17 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
seajs下require书写约定实例分析
2018/05/16 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
微信跳一跳游戏python脚本
2020/04/01 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
基于python的列表list和集合set操作
2019/11/24 Python
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
成考报名单位证明范本
2014/01/16 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
公司担保书范文
2014/05/21 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
运动会观后感
2015/06/09 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL