百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

「Python从入门到精通」(二十七)更进一步的了解Pillow吧

off999 2024-09-16 00:41 40 浏览 0 评论

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦进一步介绍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. 原图 ```py from PIL import ImageEnhance, Image

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

原始图像
![在这里插入图片描述](https://img-blog.csdnimg.cn/7d0911de589c4a4aa23d28a7366f4511.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56CB5Yac6aOe5ZOl,size_20,color_FFFFFF,t_70,g_se,x_16)

3. 图像的颜色平衡,颜色增强1.2倍
PIL.ImageEnhance.Color(image) 方法,这个方法主要用于调整图像的色彩平衡,原始图像的系数是1.0,0.0的增强系数得到的是一个黑白图像
```py
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')
  2. 调整图像的亮度 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')
  3. 调整图像的锐度 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()
  1. 找到边缘
im4 = im.filter(ImageFilter.FIND_EDGES)
im4.show()
  1. 浮雕
im5 = im.filter(ImageFilter.EMBOSS)
im5.show()
  1. 轮廓
im6 = im.filter(ImageFilter.CONTOUR)
im6.show()
  1. 锐化
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官方文档

源码获取

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

相关推荐

国家企业信用信息公示系统湖北

首先要确定你输入的登录信息是正确的,主要是看联络员手机号显示的前三位和后三位是否正确,如果正确的话点获取验证码还收不到短信的话,有可能是工商局系统内备案的手机号码中间的某位数是错误的,我出现过同样的问...

公积金贷款利率是多少(五年期公积金贷款利率是多少)

自2022年10月1日起,公积金贷款利率,手套住房:五年期以下(含五年),贷款利率2.6%,五年期以上3.1%;第二套住房公积金贷款利率,五年期以下(含五年)3.025%,五年期以上3.575%。你好...

电脑总自动关机怎么解决(电脑总自动关机怎么办)

1、主机散热不良,这是最常见的一种,主要表现为:电脑声音不正常,如风扇转动的声音;主板等配件上有烧焦的痕迹或者闻一闻有烧焦的气味;cpu等主要元器件的温度,如cpu的温度过高等。2、病毒木马的...

win7激活必须联网吗(win7激活要钱吗)

Windows操作系统在安装之后,需要激活才能正常使用。如果没有联网的情况下安装Windows操作系统,可以通过以下两种方法进行激活:1.电话激活:在Windows安装界面选择“电话激活”选项进行激活...

有必要买移动硬盘吗

  1、虽然可以,但是不合算也不适合。  2、固态硬盘相对机械硬盘而言,胜出的是性能,软肋是寿命。  3、目前的硬盘盒大都是USB接口,成了固态硬盘的瓶颈,限制了固态硬盘性能的发挥。而固态硬盘最致命的...

如何注册邮箱免费注册(如何注册邮箱免费注册网易)
  • 如何注册邮箱免费注册(如何注册邮箱免费注册网易)
  • 如何注册邮箱免费注册(如何注册邮箱免费注册网易)
  • 如何注册邮箱免费注册(如何注册邮箱免费注册网易)
  • 如何注册邮箱免费注册(如何注册邮箱免费注册网易)
移动宽带路由器怎么设置(移动宽带路由器怎么设置桥接模式)

1.结论:移动路由器设置过程包括SIM卡安装、路由器连接WiFi和设备、路由器管理界面设置等步骤。2.深入分析:(1)SIM卡安装1确认您购买的移动路由器支持的SIM卡规格,如果未知请咨询销售...

笔记本cpu天梯图全系列(笔记本cpu天梯图2020年最新版)

麒麟9000>>麒麟9000e>麒麟990>麒麟990e>麒麟980>麒麟985>麒麟820>麒麟820e>麒麟810>麒麟970>麒麟960>麒麟710>大于麒麟710a>麒麟950>麒麟955>...

怎么查询家里wifi密码(怎么查询家里wifi密码是多少)

一、通过已连接wifi的电脑查看1、找到电脑右下角的无线网图标,就是类似信号的图标,点开;2、然后右键自己的wifi名称,选择“属性”;3、进去之后勾选“显示字符”,然后就可以看见密码框的密码以数字显...

分区工具diskgenius怎么合并分区

DiskGenius是一款功能全面的磁盘管理工具,其可以帮助我们进行磁盘分区管理,包括创建新分区、删除分区、扩展分区等。如果您想要合并分区到C盘,可以按照以下步骤进行操作:1.打开DiskGeniu...

windows10易升怎么用(微软windows10易升使用教程)

windows10易升是微软官方的。windows10易升是微软官方发布的升级助理或者叫升级助手(官方下载),帮助你升级到win10最新版本,同时也帮助Win7Win8.1用户升级到Windows1...

300兆光纤买什么路由器(300兆光纤买3000m的路由器有用吗)

对于300Mbps的网速,推荐选择支持AC750及以上的路由器型号。比如TP-LinkArcherC20、D-LinkDIR-816、NetgearR6020等,都是性价比不错的选择。此类路由...

windows10产品密钥查询(查看windows10产品密钥)

要查看电脑上Windows10的产品密钥,你可以按照以下步骤进行操作:打开“开始”菜单,然后点击“设置”图标(齿轮状图标)。在“设置”窗口中,点击“更新和安全”选项。在左侧导航栏中,选择“激活”选项...

电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
电脑总死机卡住不动怎么办(电脑老是死机卡住)

如果你的电脑经常卡死,而且只能强制关机,别忘了说明电脑这个配置不够造成的,你需要提高一下它的配置,比如说加一个内存条或者换一个固态硬盘,这样才能够正常运行,不然的话这种电脑是没有办法使用的,现在电脑都...

取消回复欢迎 发表评论: