python ImageDraw类实现几何图形的绘制与文字的绘制


Posted in Python onFebruary 26, 2020

python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线、椭圆、弧、弦、多边形以及文字等。

下面直接通过示例来进行说明:

#-*- coding: UTF-8 -*- 
 
import numpy as np
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
 
 
def draw_test():
 
 #生成深蓝色绘图画布
 array = np.ndarray((480, 640, 3), np.uint8)
 
 array[:, :, 0] = 0
 array[:, :, 1] = 0
 array[:, :, 2] = 100
 
 image = Image.fromarray(array)
 
 #创建绘制对象
 draw = ImageDraw.Draw(image)
 
 #绘制直线
 draw.line((20, 20, 150, 150), 'cyan')
 
 #绘制矩形
 draw.rectangle((100, 200, 300, 400), 'black', 'red')
 
 #绘制弧
 draw.arc((100, 200, 300, 400), 0, 180, 'yellow')
 draw.arc((100, 200, 300, 400), -90, 0, 'green')
 
 #绘制弦
 draw.chord((350, 50, 500, 200), 0, 120, 'khaki', 'orange')
 
 #绘制圆饼图
 draw.pieslice((350, 50, 500, 200), -150, -30, 'pink', 'crimson')
 
 #绘制椭圆
 draw.ellipse((350, 300, 500, 400), 'yellowgreen', 'wheat')
 #外切矩形为正方形时椭圆即为圆
 draw.ellipse((550, 50, 600, 100), 'seagreen', 'skyblue') 
 
 #绘制多边形
 draw.polygon((150, 180, 200, 180, 250, 120, 230, 90, 130, 100), 'olive', 'hotpink')
 
 #绘制文本
 font = ImageFont.truetype("consola.ttf", 40, encoding="unic")#设置字体
 draw.text((100, 50), u'Hello World', 'fuchsia', font)
 
 image.show()
 
 return

首先,通过ImageDraw类创建一个绘制对象draw;

draw.line():直线的绘制,第一个参数指定的是直线的端点坐标,形式为(x0, y0, x1, y1),第二个参数指定直线的颜色;

draw.rectangle():矩形绘制,第一个参数指定矩形的对角线顶点(左上和右下),形式为(x0, y0, x1, y1),第二个指定填充颜色,第三个参数指定边界颜色;

draw.arc():(椭)圆弧的绘制,第一个参数指定弧所在椭圆的外切矩形,第二、三两个参数分别是弧的起始和终止角度, 第四个参数是填充颜色,第五个参数是线条颜色;

draw.chord():弦的绘制,和弧类似,只是将弧的起始和终止点通过直线连接起来;

draw.pieslice():圆饼图的绘制,和弧与弦类似,只是分别将起始和终止点与所在(椭)圆中心相连;

draw.ellipse():椭圆的绘制,第一个参数指定椭圆的外切矩形, 第二、三两个参数分别指定填充颜色和线条颜色,当外切矩形是正方形时,椭圆即为圆;

draw.polygon():绘制多边形,第一个参数为多边形的端点,形式为(x0, y0, x1, y1, x2, y2,……),第二、三两个参数分别指定填充颜色和线条颜色;

draw.text():文字的绘制,第一个参数指定绘制的起始点(文本的左上角所在位置),第二个参数指定文本内容,第三个参数指定文本的颜色,第四个参数指定字体(通过ImageFont类来定义)。

绘制结果如下:

python ImageDraw类实现几何图形的绘制与文字的绘制

最后,补充一下python中所支持的颜色,如下图所示:

python ImageDraw类实现几何图形的绘制与文字的绘制

另外,颜色也可以使用"#"加上6位16进制字符串表示如“#ff0000”,则和“red”等价,前两位表示R通道的值,中间两位表示G通道的值,最后两位表示B通道的值。

PS:opencv+python 实现基本图形的绘制及文本的添加

import cv2
import numpy as np
import os
 
class Drawing(object):
 """
 使用opencv绘制图形,支持直线,矩形,圆形,椭圆,多边形以及被标注文字添加
 """
 chart_list = ['line', 'rectangle', 'circle', 'ellipse', 'polylines', 'puttext']
 
 def __init__(self, src_img, dst_img, chart, dict_args):
  self.src_img = os.path.normpath(src_img)
  self.dst_img = os.path.normpath(dst_img)
  self.chart = chart
  self.dict_args = dict_args
  # 颜色不传默认为红色
  self.color = dict_args['color'] if dict_args.has_key('color') else (0,0,255)
  # 线条粗细不传默认为 2
  self.thickness = dict_args['thickness'] if dict_args.has_key('thickness') else 2
 
 def handle(self):
  # 导入图片
  self.src_img = cv2.imread(self.src_img)
  if self.chart not in self.chart_list:
   print 'must input your right parameter'
   return
  if self.chart == 'line':
   # 画直线
   self.start = self.dict_args['start']
   self.end = self.dict_args['end']
   self.draw_line()
  elif self.chart == 'rectangle':
   # 画矩形
   self.top_left = self.dict_args['top_left']
   self.bottom_right = self.dict_args['bottom_right']
   self.draw_rectangle()
  elif self.chart == 'circle':
   # 画圆形
   self.center = self.dict_args['center']
   self.radius = self.dict_args['radius']
   self.draw_circle()
  elif self.chart == 'ellipse':
   # 画椭圆
   self.center = self.dict_args['center']
   self.axes = self.dict_args['axes']
   # 旋转角度,起始角度,终止角度 可不传参,使用默认值
   self.angle = self.dict_args['angle'] if self.dict_args.has_key('angle') else 0
   self.startangle = self.dict_args['startangle'] if self.dict_args.has_key('startangle') else 0
   self.endangle = self.dict_args['endangle'] if self.dict_args.has_key('endangle') else 360
   self.draw_ellipse()
  elif self.chart == 'polylines':
   # 画多边形
   if not isinstance(self.dict_args['points'], list):
    self.pts = list(self.dict_args['points'])
   self.pts = np.array(self.dict_args['points'], np.int32)
   self.close = self.dict_args['close'] if self.dict_args.has_key('close') else True
   self.draw_polylines()
  else:
   # 标注文本
   self.text = self.dict_args['text']
   self.position = self.dict_args['position']
   # 字体,文字大小 可不传参,使用默认值
   self.font = self.dict_args['font'] if self.dict_args.has_key('font') else cv2.FONT_HERSHEY_SIMPLEX
   self.size = self.dict_args['size'] if self.dict_args.has_key('size') else 1
   self.add_text()
  cv2.imwrite(self.dst_img, self.src_img)
 
 def draw_line(self):
  # 划线
  # 输入参数分别为图像,开始坐标,结束坐标,颜色数组,粗细
  cv2.line(self.src_img, self.start, self.end, self.color, self.thickness)
 
 def draw_rectangle(self):
  # 画矩形
  # 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
  cv2.rectangle(self.src_img, self.top_left, self.bottom_right, self.color, self.thickness)
 
 def draw_circle(self):
  # 画圆形
  # 输入参数为图像,圆心,半径,线条颜色,粗细
  cv2.circle(self.src_img, self.center, self.radius, self.color, self.thickness)
 
 def draw_ellipse(self):
  # 画椭圆
  # 输入参数为图像,中心,(长轴,短轴),旋转角度,起始角度,终止角度,线条颜色,粗细
  cv2.ellipse(self.src_img, self.center, self.axes, self.angle, self.startangle,self.endangle, self.color, self.thickness)
 
 def draw_polylines(self):
  # 画多边形
  # 输入参数为图像,多边形各个顶点坐标,是否连成封闭图形,线的颜色,粗细
  cv2.polylines(self.src_img, [self.pts], self.close, self.color, self.thickness)
 
 def add_text(self):
  # 标注文本
  # 输入参数为图像、文本、位置、字体、大小、颜色数组、粗细
  cv2.putText(self.src_img, self.text, self.position, self.font, self.size, self.color, self.thickness)

以上就是python ImageDraw类实现几何图形的绘制与文字的绘制的详细内容,更多关于python 几何图形的绘制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
简单介绍Python中的round()方法
May 15 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
Python中static相关知识小结
Jan 02 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Django实现后台上传并显示图片功能
May 29 Python
Python 里最强的地图绘制神器
Mar 01 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 29 Python
Python列表解析操作实例总结
Feb 26 #Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 #Python
python实现低通滤波器代码
Feb 26 #Python
Python解释器及PyCharm工具安装过程
Feb 26 #Python
Python基础之列表常见操作经典实例详解
Feb 26 #Python
Python TKinter如何自动关闭主窗口
Feb 26 #Python
Flask和pyecharts实现动态数据可视化
Feb 26 #Python
You might like
PHP中Session的概念
2006/10/09 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
页面中js执行顺序
2009/11/09 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
用vue写一个日历
2020/11/02 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python实现一个简单的验证码程序
2017/11/03 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python导入坐标点的具体操作
2019/05/10 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
python 实现单例模式的5种方法
2020/09/23 Python
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
单位单身证明样本
2014/10/11 职场文书
年底个人总结范文
2015/03/10 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书