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 搭建Web站点之Web服务器与Web框架
Nov 06 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
Python笔试面试题小结
Sep 07 Python
python的scipy实现插值的示例代码
Nov 12 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
Python如何给你的程序做性能测试
Jul 29 Python
教你怎么用python爬取爱奇艺热门电影
May 20 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
使用 php4 加速 web 传输
2006/10/09 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PDO::inTransaction讲解
2019/01/28 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
降低python版本的操作方法
2020/09/11 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
个人批评与自我批评范文
2014/10/17 职场文书
2014年售票员工作总结
2014/11/19 职场文书
房产电话营销开场白
2015/05/29 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Java spring定时任务详解
2021/10/05 Java/Android
一文简单了解MySQL前缀索引
2022/04/03 MySQL
详解OpenCV曝光融合
2022/04/29 Python