Day 21 : pillow套件,处理照片

在python中,有许多可以拿来处理影像的套件。今天就先稍微介绍一下,pillow这个影像处理套件。

Pillow(PIL)

Pillow是一个python中用来做影像辨识的套件库,可以用来旋转照片、嵌字、合成照片、变更图片解析度等。网路上常常看到PIL,其实PIL是python2时期的产物,有点像是pillow的前身,到了python3,PIL才正式停止更新,之後便由Pillow接手PIL套件库的东西并改强功能。这就是为甚麽在import时还是需要import PIL的原因。

安装pillow

pip install Pillow

下图从官网上找到的所有Pillow中的模组,可以根据想要的功能来使用,因为太多功能了我这边就不一一赘述。
https://ithelp.ithome.com.tw/upload/images/20211004/20138060A7hk4PTXOX.png

  • Image.open() : 开启指定照片,後面括弧要放路径
  • show() : 显示指定照片,前面要接变数名称以及点号
  • save() : 将处理完的照片存档,前面要接变数名称以及点号
  • size() : 取得图片长宽

再来就来介绍几个常用的功能吧。

照片旋转

在Pillow中,可以利用rotate()来调整相片角度

from PIL import Image

img = Image.open("./test.png")
img.show()

newImg = img.rotate(90) 
newImg.show()
newImg.save("test90.png")

rotate()後面的参数放的是旋转的角度,上述程序码将原图片旋转90度後,再存成"test90.png"

执行前:
https://ithelp.ithome.com.tw/upload/images/20211004/20138060QUZwBQvdAZ.png
执行後:
https://ithelp.ithome.com.tw/upload/images/20211004/20138060d9pfiNiWLE.png
可以看到,他可以将档案直接旋转,但并不会改变长宽比例

转档

在使用save()功能时,可以在档名後方加上format参数来指定档案格式,可是通常档名就已经定义了副档名了,多打可以帮助Pillow更严谨的确定档名

from PIL import Image

img = Image.open("test.jpg")
img.show()

newImg = img
newImg.save("test2.jpg","jpg")

convert()模式转换

convert()这个函式用来转变照片的模式,这边就来讲讲几个比较会用到的:

  • 1 : 二值化模式,照片中的颜色不是黑就是白
  • L : 黑白模式,有灰阶的存在
  • RGBA : 拥有透明度(Alpha)的全彩模式
  • CMYK : 印刷全彩模式

官网中有更多不同的模式,如果好奇可以点这里进去看看。

这边就拿二值化模式来测试好了,一样用刚刚那张IT邦的截图:

from PIL import Image

img = Image.open("./test.png")
img.show()

newImg = img.convert('1')  
newImg.show()
newImg.save("test1.png")

https://ithelp.ithome.com.tw/upload/images/20211004/20138060oUseLVme5f.png
看起来超诡异的(((

更改图片尺寸(长宽)

更改尺寸一定会要用到resize()这个函式,这个函式需要输入两个参数,第一个参数是尺寸(长宽),第二个是Filters的模式,若没特别需要可以用预设就好。

这边有Filters的模式的详细说明,不过老实说我也不是研究影像辨识的所以有看没有懂(X

from PIL import Image

img = Image.open("./test.png")
img.show()

newImg = img.resize((500,1000),Image.LANCZOS) 
newImg.show()
newImg.save("test500.png")

原本有看到一个Filters叫做ANTIALIAS,官网上好像没提到,最後找了找资料才发现他是2.7.0版本的旧东西,现在已经更名为LANCZOS了。
https://ithelp.ithome.com.tw/upload/images/20211004/20138060Lc8OC0x0Hk.png
这个Filters标榜高品质,所以我使用这个来做测试,这张图片原本是222106,我直接把它改成5001000。
https://ithelp.ithome.com.tw/upload/images/20211004/20138060vNgxJBnUqy.png
可以看到图片很明显的改变长宽了
https://ithelp.ithome.com.tw/upload/images/20211004/20138060B2WlkoLpQn.png
https://ithelp.ithome.com.tw/upload/images/20211004/20138060evu7jUxZmA.png

嵌字

有些人可能会想在照片上加入一些文字,当然在Pillow中也可以轻而易举地做到,而且可以使用自己想要的字体也能说是非常的方便。废话不多说先上程序码:

from PIL import Image, ImageDraw, ImageFont

img  = Image.open("test.png")
draw = ImageDraw.Draw(img)

font  = ImageFont.truetype("kaiu.ttf", 20)
color  = "purple"
text = "这是测试"

draw.text((10, 10), text, fill=color, font=font)

img.save("test1.png")

先用ImageDraw.Draw()给打开的照片一个画布让它可以在上面做更改,之後用ImageFont.truetype()来选择字体,这个函式要放三个参数,第一个是字型档案,我事先有下载好kaiu.ttf(标楷体)这个字型,第二个是字型大小,第三个是解编码格式,可有可无。我们也可以使用ImageFont.load_default()来使用预设字型,就不须设定字型了。

再来我将color定义为purple并存入color变数中,并先打好"这是测试"的文字後存入text变数中。

之後就要用到text()函式了,对刚刚的画布使用text()函式,後面我放入了四个参数,分别是x,y座标、文字、fill(填入颜色)以及font(字体设定),并将嵌入文字後的照片存档为test1.png。
https://ithelp.ithome.com.tw/upload/images/20211004/20138060UDK4fojifA.png
就可以轻松在图片上填入文字罗!

影像合成

from PIL import Image

imageA = Image.open('test.png')
imageB = Image.open('githubIcon.png')
imageB = imageB.convert("RGBA")
widthB , heightB = imageB.size

newimageB  = imageB.resize((int(widthB*0.2),int(heightB*0.2)),Image.LANCZOS)

resultPicture = Image.new('RGBA', imageA.size, (0, 0, 0, 0))

resultPicture.paste(imageA,(0,0))
resultPicture.paste(newimageB, (0,0), newimageB)

resultPicture.save("result.png")

https://ithelp.ithome.com.tw/upload/images/20211004/20138060XEChHqILAi.png
合成两张照片其实还满简单的。这个例子中我先将githubIcon这张照片等比例缩小,然後使用new()这个函式,建立起一个长宽为test这张图(IT邦的图)大小的背景底图,最後的(0, 0, 0, 0)则是颜色,之後使用paste把图片依序贴到这张底图就好了,这边有个细节要注意,我在贴上githubIcon这张照片时,我设定了第三个参数mask,这是为了让它产生的图片背景是透明的而设的,没设mask会导致原本的底色显示出来。
https://ithelp.ithome.com.tw/upload/images/20211004/201380606MKkJ8O963.png
上图就是没设mask的结果,照片中心因为没有设mask的原因导致将背景的IT邦字样挡住了。

以上就是最基本的Pillow(PIL)套件功能,会了这几个功能应该就能做非常简单的图片处理了,再加上其他套件的功能,就可以写出超级阳春的P图软件了。明天会来开始介绍TKinter这款最基础的pythonGUI套件,让读者可以开始进入图像介面的领域。


<<:  【Day 19】Google Apps Script - API 篇 - Spreadsheet Service - 电子试算表服务范例-新增内容

>>:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day19

JS 34 - 实作 Medium 的渐进式图片载入效果

大家好! 各位知道 Medium 的图片载入效果吗? 就是先模糊图片,等到载入完成再将图片转为清晰的...

[Day_1] Python基础小教室

嗨~大家好, 接下来是为期一个月的铁人挑战 print('Day_1') 今天是想先跟大家做跟心灵喊...

Day27-介接 API(番外篇 II)Dialogflow ES 之 Intents 与 Entities

大家好~ 今天来一起实作 Intents 与 Entities 吧! CREATE INTENT 在...

Spring Framework X Kotlin Day 1 Introduction

GitHub Repo https://github.com/b2etw/Spring-Kotlin...