专栏名称: 编程派
Python程序员都在看的公众号,跟着编程派一起学习Python,看最新国外教程和资源!
目录
相关文章推荐
Python爱好者社区  ·  爬虫行情变了,差别真的挺大。。。 ·  20 小时前  
Python中文社区  ·  三年稳赚40倍!用布林带挤压策略跑赢特斯拉 ·  2 天前  
Python爱好者社区  ·  DeepSeek 被放弃了,阿里牛逼! ·  2 天前  
Python爱好者社区  ·  刚刚,DeepSeek放出重磅论文!梁文锋亲 ... ·  4 天前  
Python爱好者社区  ·  吴恩达,yyds ·  4 天前  
51好读  ›  专栏  ›  编程派

使用Pillow对图像进行编辑修改

编程派  · 公众号  · Python  · 2017-01-17 11:52

正文

接昨天那篇,更深入地学习Pillow的用法。

作者:liam0205

原文:http://liam0205.me/2015/04/22/pil-tutorial-basic-usage/index.html


上一篇文章 介绍了 PIL 的基本情况,以及 Image 模块的基本用法。这篇文章,我们讨论一下 ImageDraw ImageFont 两个模块的基本用法,说说如何用 PIL 在现有的图片上涂涂改改。

ImageDraw 模块

ImageDraw 模块提供了 Draw 类,它能在 Image 实例上进行简单的 2D 绘图。当然复杂的绘图动作是由简单的动作合成而得的,理论上这些动作 ImageDraw 模块也能做,只是相对复杂。如果你想在 Image 实例上做复杂的绘图动作,最好是自行对 ImageDraw 模块提供的各种方法做一些封装。

创建一个 Draw 类的实例

要在 Image 实例上绘制新的图样,首先要做的就是创建一个 Draw 类的实例。

  1. from PIL import Image, ImageDraw

  2. sourceFileName = "source.png"

  3. avatar = Image.open(sourceFileName)

  4. drawAvatar = ImageDraw.Draw(avatar)

代码前三行我们已经见过,唯一的差别在于 import 之后除了我们已经见过的 Image 模块,还有今次我们要使用的 ImageDraw 模块。

从画两条平行线开始

Draw 类提供了 line ( xy , options ) 方法绘制直线。

其中 xy 表示坐标列表,其形式可以是

  • [ ( x 1 , y 1 ), ( x 2 , y 2 ), ... ] - 包含若干个元组的列表

  • [ x 1 , y 1 , x 2 , y 2 , ... ] - 按照顺序包含坐标信息的列表

  • [ x 1 , y 1 , ( x 2 , y 2 ), ... ] - 以上两种情况的混合

  • (( x 1 , y 1 ), ( x 2 , y 2 ), ...) - 包含若干个元组的元组

  • ( x 1 , y 1 , x 2 , y 2 , ...) - 按照顺序包含坐标信息的元组

  • ( x 1 , y 1 , ( x 2 , y 2 ), ...) - 以上两种情况的混合

options 中可用的选项有

  • fill = ( R , G , B ) - 用于指定线条的颜色,其中 R G B 都是 0 - 255 的整数

  • width = integer - 用于指定线条的宽度,单位是像素

  1. from PIL import Image, ImageDraw

  2. sourceFileName = "source.png"

  3. avatar = Image.open(sourceFileName)

  4. drawAvatar = ImageDraw.Draw(avatar)

  5. xSize, ySize = avatar.size

  6. drawAvatar.line([0, 0.33 * ySize, xSize, 0.33 * ySize],

  7.                fill=(255, 100, 0), width=3)

  8. drawAvatar.line([0, 0.67 * ySize, xSize, 0.67 * ySize],

  9.                fill=(255, 0, 0), width=3)

  10. del drawAvatar

  11. avatar.show()

这里我们在图片的两个三等分位置分别画了一条宽度为 3 像素的平行线。一条颜色为(255, 100, 0),另一条则是(255, 0, 0)。

值得注意的是代码的第 14 行,我们直接用 avatar . show () 来展现绘图的结果。可见 * Draw 类的实例将直接在 Image 实例上进行操作 *。

画一段弧

Draw 类也提供了 arc ( xy , start , end , options ) 方法来绘制弧。

这里的 xy 是一个长度为 4 的列表,用来表示一个 bounding box (参考上一篇文章)。 start end 则是弧的起止角度,单位是 °。其中水平向右的方向为 0°,竖直向下的方向为 90°,水平向左的方向为 180°,竖直向上的方向为 270°。

options 中可用的选项有

  • fill = ( R , G , B ) - 用于指定线条的颜色,其中 R G B 都是 0 - 255 的整数

arc 方法将在内切于 bounding box 的椭圆中,按照给定的起止角度切下一段弧,并绘制于 Image 示例之上。

  1. from PIL import Image, ImageDraw

  2. sourceFileName = "source.png"

  3. avatar = Image.open(sourceFileName)

  4. drawAvatar = ImageDraw.Draw(avatar)

  5. xSize, ySize = avatar.size

  6. drawAvatar.arc([0, 0, xSize, ySize], 0, 90,

  7.               fill =(255, 100, 255))

  8. del drawAvatar

  9. avatar.show()

在图片上写字

Draw 类提供了 text ( position , string , options ) 方法,该方法可以在 Image 实例上写字。

需要说明的是, position 指定的是文本左上角的顶点,而不是文本中心。这里可用的 options

  • font = ImageFont instance \ - 指定字体,接受一个 ImageFont 的实例

  • fill = ( R , G , B ) \ - 用于指定线条的颜色,其中 R G B 都是 0 - 255 的整数

  1. from PIL import Image, ImageDraw

  2. sourceFileName = "source.png"

  3. avatar = Image.open(sourceFileName)

  4. drawAvatar = ImageDraw.Draw(avatar)

  5. xSize, ySize = avatar.size

  6. drawAvatar.text([0.9 * xSize, 0.1 * ySize - drawAvatar.textsize("3")[1]],

  7.                "3", fill=(128, 0, 128))

  8. del drawAvatar







请到「今天看啥」查看全文