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设置tmpfs来加速项目的教程
Apr 17 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
python Flask实现restful api service
Dec 04 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
pytorch多GPU并行运算的实现
Sep 27 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
通过实例解析python描述符原理作用
Jan 22 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
如何使用Python进行PDF图片识别OCR
Jan 22 Python
看看如何用Python绘制小米新版天价logo
Apr 20 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下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
PHP下对数组进行排序的函数
2010/08/08 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python检索特定内容的文本文件实例
2018/06/05 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
python实现猜数字游戏
2020/03/25 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Tostadora意大利:定制T恤
2019/04/08 全球购物
请说出以下代码输出什么
2013/08/30 面试题
策划助理岗位职责
2013/11/18 职场文书
学习保证书范文
2014/04/30 职场文书
活动倡议书范文
2014/05/13 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
谢师宴家长致辞
2015/07/27 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers