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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python 字典dict使用介绍
Nov 30 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
pandas中去除指定字符的实例
May 18 Python
想学python 这5本书籍你必看!
Dec 11 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
python mysql中in参数化说明
Jun 05 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
解决python3中os.popen()出错的问题
Nov 19 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
Django显示可视化图表的实践
May 10 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
js 文件引入实现代码
2010/04/23 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
Vuex简单入门
2017/04/19 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
电焊工岗位职责
2014/03/06 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
2014年妇女工作总结
2014/12/06 职场文书
优秀团员事迹材料
2014/12/25 职场文书
捐助倡议书
2015/01/19 职场文书
工程部主管岗位职责
2015/02/12 职场文书
三八妇女节致辞
2015/07/31 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python