您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
进一步介绍Pillow库的使用,详细了解
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
本文是接上一篇❤️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手❤️ 进一步介绍Pillow库的使用,本文将重点介绍一些高级特性:比如如何利用Pillow画图形(圆形,正方形),介绍通过Pillow库给图片添加水印;同时对上一篇文章未介绍的常用知识点进行补充说明。希望对读者朋友们有所帮助。
上一篇文章已经介绍了Image模块,但是介绍的还不够全面,例如如何从网页中读取图片没有介绍到,如何裁剪图片都没有介绍到。
读取网页中的图片的基本实现方式是:首先利用requests库读取当前图片链接的内容,接着将内容转成二进制数据,在通过open方法将该二进制数据,最后通过save方法进行保存。
from PIL import Imagefrom io import BytesIOimport 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.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模块主要是用于设置图片的颜色对比度亮度锐度等啥的,增强图像。
from PIL import ImageEnhance, Imageorg_img = Image.open("picture/img10.png")org_img.show(title="原图")
原始图像
cl = ImageEnhance.Color(org_img)#黑白图像ce = cl.enhance(0)ce.show()#增强1.2倍ce1 = cl.enhance(1.2)ce1.show()
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")
sp = ImageEnhance.Sharpness(org_img)se = sp.enhance(0)se.show(title="锐度0")se1 = sp.enhance(20)se1.show(title="锐度20")
ImageFilter模块主要用于对图像进行过滤,增强边缘,模糊处理,该模块的使用方式是im.filter(ImageFilter)
。
其中ImageFilter按照需求传入指定的过滤值。
过滤值 | 作用 |
---|---|
ImageFilter.GaussianBlur | 高斯模糊 |
ImageFilter.BLUR | 普通模糊 |
ImageFilter.EDGE_ENHANCE | 边缘增强 |
ImageFilter.FIND_EDGES | 找到边缘 |
ImageFilter.EMBOSS | 浮雕 |
ImageFilter.CONTOUR | 轮廓 |
ImageFilter.SHARPEN | 锐化 |
下面一个个试下效果
from PIL import Image, ImageFilterim = 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模块主要用于对屏幕进行截图,通过grab方法进行截取,如果不传入任何参数则表示全屏幕截图,否则是截取指定区域的图像。其中box格式是:(x1,x2,y1,y2)
from PIL import ImageGrabim1 = ImageGrab.grab((0, 0, 600, 300)) # 截取屏幕600*300的区域的图像im2 = ImageGrab.grab() # 不带参数表示全屏幕截图im1.show()im2.show()
利用Pillow库可以轻易的对图像增加水印
首先,用PIL的Image函数读取图片
接着,新建一张图(尺寸和原图一样)
然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取。
from PIL import Image, ImageDraw, ImageFontfont_size = 8text = "泳池美女"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库的使用,希望对读者朋友们有所帮助。
需要获取源码的小伙伴可以关注下方的公众号,回复【python】
为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。
我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。
我是码农飞哥,再次感谢您读完本文。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/122163.html
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本篇重点介绍Python处理图像的标准库PIL库,处理图像真的的很方便。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。 文章目录 前言安装Pillow 以及版本兼容常用模块介绍ImageImageColorImageFontImageDraw 再来点干货吧!合并美女照片 总结参考源码地址...
文章目录 强烈推荐系列教程,建议学起来!! 一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置 4.2手动添加镜像源4.3永久配置镜像源 五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件 六.美女背景七.自定义脚本开头八、这个前言一定要看九、pyt...
摘要:它是一门解析型的语言,何为解析型语言呢就是在运行时通过解析器将源代码一行行解析成机器码。而像语言,等则是编译型的语言,即通过编译器将所有的源代码一次性编译成二进制指令,生成一个可执行的程序。 ...
摘要:前言有好久没有写博客了主要这段时间都沉迷学习无法自拔了哈哈自吹一波前两天不是节吗所以就有很多福利出现了当然每个人能都获得的信息都有所不同这就是所谓的信息差秉着好东西需要分享和开源的好习惯所以来给你们送福利了其他福利一程序员节最新福利之最全资 前言 有好久没有写博客了,主要这段时间都沉迷学习无法自拔了,哈哈.自吹一波. 前两天不是1024节吗,所以就有很多福利出现了,当然每个人能都获得的...
摘要:前言有好久没有写博客了主要这段时间都沉迷学习无法自拔了哈哈自吹一波前两天不是节吗所以就有很多福利出现了当然每个人能都获得的信息都有所不同这就是所谓的信息差秉着好东西需要分享和开源的好习惯所以来给你们送福利了其他福利一程序员节最新福利之最全资 前言 有好久没有写博客了,主要这段时间都沉迷学习无法自拔了,哈哈.自吹一波. 前两天不是1024节吗,所以就有很多福利出现了,当然每个人能都获得的...
阅读 3004·2021-11-23 09:51
阅读 3359·2021-11-09 09:46
阅读 3208·2021-11-09 09:45
阅读 703·2021-10-11 10:58
阅读 2815·2019-08-29 17:31
阅读 1647·2019-08-26 13:39
阅读 2596·2019-08-26 12:12
阅读 3432·2019-08-26 12:08