您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦

进一步介绍Pillow库的使用,详细了解

干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

本文是接上一篇️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手️ 进一步介绍Pillow库的使用,本文将重点介绍一些高级特性:比如如何利用Pillow画图形(圆形,正方形),介绍通过Pillow库给图片添加水印;同时对上一篇文章未介绍的常用知识点进行补充说明。希望对读者朋友们有所帮助。

Image模块

上一篇文章已经介绍了Image模块,但是介绍的还不够全面,例如如何从网页中读取图片没有介绍到,如何裁剪图片都没有介绍到。

读取网页中的图片

读取网页中的图片的基本实现方式是:首先利用requests库读取当前图片链接的内容,接着将内容转成二进制数据,在通过open方法将该二进制数据,最后通过save方法进行保存。

from PIL import Image
from io import BytesIO
import requests
# 读取网页图片
res = requests.get(
'https://img-blog.csdnimg.cn/f2e98e08d5ec4283b08972c5ee8e1689.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56CB5Yac6aOe5ZOl,size_20,color_FFFFFF,t_70,g_se,x_16').content
#将图片内容转成二进制
im2 = Image.open(BytesIO(res))
b = BytesIO()
im2.save(b, format='PNG')
im2.show()

读取结果是:

图片裁剪

通过crop方法可以从图片中裁剪出一个指定大小的区域。裁取的区域范围是(left, upper, right, lower) 比如从某个宽高都是400的图片中裁剪一个是宽高都是100的正方形区域,只需要指定裁剪区域的坐标是: (0, 0, 100, 100)

im2 = Image.new('RGBA', (400, 400), 'blue')
box = (0, 0, 100, 100)
region = im2.crop(box) # 设置要裁剪的区域
region.show()

有裁剪还有一个方法就是重新设置图片大小的方法 resize,比如将前面400400的图片 修改成 300200,只需要调用resize方法

img4 = im2.resize((300, 200))
img4.show()

图片模式的说明:

模式 描述
1 1位像素,黑白图像,存成8位像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3*8位像素,真彩
RGBA 4*8 位像素,真彩+透明通道
CMYK 4*8位像素,印刷四色模式或彩色印刷模式
YCbCr 3*8位像素,色彩视频格式
I 32位整型像素
F 33位浮点型像素

通过 convert方法进行图片模式的转换

ImageDraw模块

前面介绍的ImageDraw库,只是介绍了利用它来向图片写入文本,其实ImageDraw模块还有一个更有用的途径,就是可以通过它来画各种图形。

画图的方法介绍

方法 示范 作用
ImageDraw.line(xy, fill=None, width=0, joint=None) draw.line([100, 100, 100, 500], fill='blue', width=2) 画正方形
ImageDraw.arc(xy, start, end, fill=None, width=1) draw.arc([100, 100, 600, 600], 0, 360, fill='black') 画弧形
ImageDraw.ellipse(xy, fill=None, outline=None, width=1) draw.ellipse([100, 100, 600, 600], outline='black', fill='white') 画圆
ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) draw.chord([100, 100, 600, 600], 0, 360, outline=125) 画半圆,类似于arc()
ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1) draw.pieslice([100, 100, 600, 600], 180, 210, outline=255) 画扇形
ImageDraw.rectangle(xy, fill=None, outline=None, width=1) draw.rectangle((200, 200, 500, 500), outline='yellow') 画矩形
ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) draw.rounded_rectangle((200, 200, 600, 600), radius=1, outline='green') 画圆角矩形(或正方形)

画正方形

首先创建一个600*600的画布。然后再画布中画出一个正方形,画直线的方法是 line方法。

ImageDraw.line(xy, fill=None, width=0, joint=None)

在xy的坐标之间画一条直线

xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]

fill--> 直线的颜色

width--> 直线的宽度

# 画点
im = Image.new('RGB', (600, 600), 'white')
draw = ImageDraw.Draw(im) # # 创建一个正方形,fill 代表的为颜色
draw.line([100, 100, 100, 500], fill='blue', width=2) # 左竖线
draw.line([100, 100, 500, 100], fill='blue', width=2) # 上横线
draw.line([500, 100, 500, 500], 'blue', width=2) #右竖线
draw.line([100, 500, 500, 500], 'blue', width=2) #下横线
im.save('picture/sequare.png', 'png')
im.show()

画一个边框宽度为2px,颜色为蓝色的,面积为400*400的正方形。

画弧形

ImageDraw.arc(xy, start, end, fill=None, width=0)

在给定的区域范围内,从开始角到结束角之间绘制一条圆弧

xy--> 定义边界框的两个点,传入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

start --> 起始角度,以度为单位,从3点钟开始顺时针增加

end--> 结束角度,以度为单位

fill--> 弧线的颜色

width-->弧线的宽度

draw.arc([100, 100, 600, 600], 0, 180, fill='black')
im.show()



这里就是画了一个半圆,如果结束角度是360度的话则就会画一个完整的圆。

画圆

画圆通过ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,该方法可以画出一个给定范围的圆

xy--> 定义边界框的两个点,传入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

outline--> 轮廓的颜色

fill ---> 填充颜色

width--> 轮廓的宽度

draw.ellipse([100, 100, 600, 600], outline='black', fill='blue')
im.show()

画半圆

ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用来画半圆,跟arc()方法不同的是它会用直线将起始点和结束点连接起来

xy--> 定义边界框的两个点,传入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

outline--> 轮廓的颜色

fill ---> 填充颜色

width--> 轮廓的宽度

draw.chord([100, 100, 600, 600], 0, 180,  outline='black', fill='red')
im.show()

画扇形

ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1)

类似于arc()方法,不过他会在端点和圆点之间画直线

xy--> 定义边界框的两个点,传入的格式是[(x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0

start --> 起始角度,以度为单位,从3点钟开始顺时针增加

end--> 结束角度,以度为单位

fill--> 弧线的颜色

width-->弧线的宽度

draw.pieslice([100, 100, 600, 600], 180, 300, outline='red', fill='blue')
im.show()

画矩形

ImageDraw.rectangle(xy, fill=None, outline=None, width=1)

xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]

outline--> 轮廓的颜色

fill--> 填充的颜色

width--> 轮廓线的宽度

# 矩形
draw.rectangle((100, 200, 300, 500), outline='red', fill='blue')
im.show()

画圆角矩形

ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) 该方法可以画一个圆角矩形

xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]

radius--> 角的半径

outline--> 轮廓的颜色

fill--> 填充的颜色

width--> 轮廓线的宽度

draw.rounded_rectangle((200, 200, 600, 600), radius=2, outline='green')
im.show()

解决一个问题

这里有个问题,就是画好的图形如何从Image中扣出来呢?

ImageEnhance模块

ImageEnhance模块主要是用于设置图片的颜色对比度亮度锐度等啥的,增强图像。

  1. 原图
from PIL import ImageEnhance, Image

org_img = Image.open('picture/img10.png')
org_img.show(title='原图')

原始图像

  1. 图像的颜色平衡,颜色增强1.2倍

    PIL.ImageEnhance.Color(image) 方法,这个方法主要用于调整图像的色彩平衡,原始图像的系数是1.0,0.0的增强系数得到的是一个黑白图像
cl = ImageEnhance.Color(org_img)
#黑白图像
ce = cl.enhance(0)
ce.show()
#增强1.2倍
ce1 = cl.enhance(1.2)
ce1.show()

  1. 调整图像的对比度 3:4

    PIL.ImageEnhance.Contrast(image)该方法主要用于调整图像的对比度,类似于电视机上的对比度控制,0.0的增强系数给出的是一个纯灰色图像,系数1.0则得到原始图像
ct = ImageEnhance.Contrast(org_img)
ch = ct.enhance(0)
ch.show(title='对比度0纯灰色')
ch1 = ct.enhance(3.4)
ch1.show(title='对比度3.4')



7. 调整图像的亮度

PIL.ImageEnhance.Brightness(image) ,该方法主要用于调整图像的亮度,0.0的增强系数表示黑色图像。系数为1.0则得到原始图像。

br = ImageEnhance.Brightness(org_img)
be = br.enhance(0)
be.show(title='亮度0')
be = br.enhance(3)
be.show(title='亮度3')

  1. 调整图像的锐度

    PIL.ImageEnhance.Sharpness(image) ,该方法主要用于调整图像的锐度,0.0的增强因子为模糊图像,1.0的增强因子为原始图像,2.0的增强因子为锐化图像。
sp = ImageEnhance.Sharpness(org_img)
se = sp.enhance(0)
se.show(title='锐度0')
se1 = sp.enhance(20)
se1.show(title='锐度20')

ImageFilter模块

ImageFilter模块主要用于对图像进行过滤,增强边缘,模糊处理,该模块的使用方式是im.filter(ImageFilter)

其中ImageFilter按照需求传入指定的过滤值。

过滤值 作用
ImageFilter.GaussianBlur 高斯模糊
ImageFilter.BLUR 普通模糊
ImageFilter.EDGE_ENHANCE 边缘增强
ImageFilter.FIND_EDGES 找到边缘
ImageFilter.EMBOSS 浮雕
ImageFilter.CONTOUR 轮廓
ImageFilter.SHARPEN 锐化

下面一个个试下效果

  1. 原图
from PIL import Image, ImageFilter
im = Image.open('picture/img10.png')
im.show()



2. 高斯模糊

im1 = im.filter(ImageFilter.GaussianBlur)
im1.show()



3. 普通模糊

im2 = im.filter(ImageFilter.BLUR)
im2.show()



4.边缘增强

im3 = im.filter(ImageFilter.EDGE_ENHANCE)
im3.show()



5. 找到边缘

im4 = im.filter(ImageFilter.FIND_EDGES)
im4.show()



6. 浮雕

im5 = im.filter(ImageFilter.EMBOSS)
im5.show()



7. 轮廓

im6 = im.filter(ImageFilter.CONTOUR)
im6.show()



8. 锐化

im7 = im.filter(ImageFilter.SHARPEN)
im7.show()

ImageGrab模块

ImageGrab模块主要用于对屏幕进行截图,通过grab方法进行截取,如果不传入任何参数则表示全屏幕截图,否则是截取指定区域的图像。其中box格式是:(x1,x2,y1,y2)

from PIL import ImageGrab
im1 = ImageGrab.grab((0, 0, 600, 300)) # 截取屏幕600*300的区域的图像
im2 = ImageGrab.grab() # 不带参数表示全屏幕截图
im1.show()
im2.show()

利用Pillow库对图像增加水印

利用Pillow库可以轻易的对图像增加水印

首先,用PIL的Image函数读取图片

接着,新建一张图(尺寸和原图一样)

然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取。

from PIL import Image, ImageDraw, ImageFont

font_size = 8
text = "泳池美女" img_raw = Image.open("../picture/beautiful.jpeg")
# 1.读取图像,获取每一个像素值
img_array = img_raw.load()
# 2. 新建画布,选好要使用的字体大小
new_img = Image.new('RGB', img_raw.size, 'gray')
font = ImageFont.truetype("../picture/simsun.ttf", size=font_size)
draw = ImageDraw.Draw(new_img) # 搞一个生成器(不断循环"泳池美女")
def character_generate(text):
while True:
for i in range(len(text)):
yield text[i] char_gen = character_generate(text)
# 实现效果
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x + 1, y + 1), next(char_gen), font=font, fill=img_array[x, y]) new_img.convert('RGB').save("../picture/beautiful_result.jpeg")

原图



添加文字后的效果图

总结

本文详细介绍了Pillow库的使用,希望对读者朋友们有所帮助。

参考

Pillow官方文档

源码获取

需要获取源码的小伙伴可以关注下方的公众号,回复【python】

我是码农飞哥,再次感谢您读完本文

全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的快乐

我是码农飞哥,再次感谢您读完本文

❤️【Python从入门到精通】(二十七)更进一步的了解Pillow吧!的更多相关文章

  1. 【Python从入门到精通】(二十五)Python多进程的使用

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本篇重点介绍Python多进程的使用,读者朋友们可以将多进程和多线程两者做一个对比学习. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题 ...

  2. Python 从入门到精通:一个月就够了

    毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...

  3. iOS开发-UI 从入门到精通(二)

    iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...

  4. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  5. Python从入门到精通视频(全60集) ☝☝☝

    Python从入门到精通视频(全60集) Python入门到精通 学习 教程 首先,课程的顺序需要调整:一和三主要是介绍学习和布置开发环境的,一介绍的是非VS开发,三介绍的是VS开发.VS2017现在 ...

  6. Python从入门到精通视频(全60集)✍✍✍

    Python从入门到精通视频(全60集)  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看 ...

  7. 【Python从入门到精通】(九)Python中字符串的各种骚操作你已经烂熟于心了么?

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文将重点介绍Python字符串的各种常用方法,字符串是实际开发中经常用到的,所有熟练的掌握它的各种用法显得尤为重要. 干货满满,建议收藏,欢迎大 ...

  8. Python基本语法,python入门到精通[二]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现 ...

  9. ❤️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本篇重点介绍Python处理图像的标准库PIL库,处理图像真的的很方便. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎踊跃 ...

随机推荐

  1. Python中的私有属性私有方法、类属性类方法以及单例设计模式

    私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...

  2. 初学AOP小结

    Spring AOP理解 参考链接 AOP简介 AOP(面向切面编程),可以说时OOP的补充,使用OOP时,我们在日常编写代码的时候,一旦牵涉到大型一点的项目,项目不可或缺的事务处理,安全处理,验证处 ...

  3. 多文件Makefile编写

    工作过程中,平时不怎么关注Makefile的书写规则,对于遇到的编译错误一般能看懂Makefile的基本规则也能解决.但如果想要编写Makefile文件还是有相当的难度的,更不用说包含多个目录和文件的 ...

  4. Vue element keyup.enter失效不起作用

    解决方式一 添加按键修饰符@keyup.enter.native 解决方式二 把事件绑定到父元素(外框),需注意多个input问题 <div @keyup.enter="login&q ...

  5. AQS快速入门

    一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...

  6. 安卓开发 利用百度识图api进行物体识别

    前文 之前的随笔中,已经通过相机或相册获取到了我们想要的图片,接下来进行识图api的配置工作.我使用的是百度的api,利用python获取信息,并在MainActivity中进行调用来输出信息. 一. ...

  7. PHP中DirectIO直操作文件扩展的使用

    关于 PHP 的文件操作,我们也将是通过一系列的文章来进行学习.今天我们先学习的是一个很少人使用过,甚至很多人根本不知道的扩展,它与我们日常的文件操作有些许的不同.不过这些差别并不是我们肉眼所能直观看 ...

  8. PHP中的日期相关函数(三)

    之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式.当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了.另外,Date() 和 ti ...

  9. 【PHP】数组按照字母排序

    /** * 将数组按字母A-Z排序 * @return [type] [description] */ private function chartSort($list) { // $user=$th ...

  10. ecshop调用指定栏目下的商品的方法

    第一步 在系统目录文件找到includes/lib_goods.php  这个文件打开 在此页最底部加入以下函数代码 /** * 首页获取指定分类产品 * * @access public * @pa ...