pillow 圖像縮放操作

2022-08-29 10:55 更新

在圖像處理過(guò)程中經(jīng)常會(huì)遇到縮小或放大圖像的情況,Image 類提供的 ?resize()? 方法能夠?qū)崿F(xiàn)任意縮小和放大圖像。


?resize()? 函數(shù)的語(yǔ)法格式如下:

resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)

參數(shù)說(shuō)明:

  • size:元組參數(shù) (width,height),圖片縮放后的尺寸;
  • resample:可選參數(shù),指圖像重采樣濾波器,與 ?thumbnail()? 的 resample 參數(shù)類似,默認(rèn)為 Image.BICUBIC;
  • box:對(duì)指定圖片區(qū)域進(jìn)行縮放,box 的參數(shù)值是長(zhǎng)度為 4 的像素坐標(biāo)元組,即 (左,上,右,下)。注意,被指定的區(qū)域必須在原圖的范圍內(nèi),如果超出范圍就會(huì)報(bào)錯(cuò)。當(dāng)不傳該參數(shù)時(shí),默認(rèn)對(duì)整個(gè)原圖進(jìn)行縮放;
  • reducing_gap:可選參數(shù),浮點(diǎn)參數(shù)值,用于優(yōu)化圖片的縮放效果,常用參數(shù)值有 3.0 和 5.0。

注意,?resize() ?會(huì)返回一個(gè)新的 image 對(duì)象。


下面是一組對(duì)圖像進(jìn)行放大操作的示例:

from PIL import Image
im = Image.open("./w3cschool.png")
try:
    #放大圖片
    image=im.resize((428,200))
    #將新圖像保存至桌面
    image.save("../放大圖像.png")
    print("查看新圖像的尺寸",image.size)
except IOError:
    print("放大圖像失敗")

輸出結(jié)果:

查看新圖像的尺寸 (428, 200)

放大后的圖片效果。如下所示:


圖1:pillow放大圖像

 注:原圖尺寸為428,100,因?yàn)榉糯蟮某叽缗c原尺寸不是等比例的,所以會(huì)出現(xiàn)拉伸現(xiàn)象!


對(duì)圖片的局部位置進(jìn)行放大,示例如下:

from PIL import Image
im = Image.open("../w3cschool.png")
try:
    #選擇放大的局部位置,并選擇圖片重采樣方式
    # box四元組指的是像素坐標(biāo) (左上點(diǎn),右下點(diǎn)) 
    #(0,0,110,100),表示以原圖的左上角為原點(diǎn)(0,0),選擇寬和高分別是(110,100)的圖像區(qū)域(右下點(diǎn)(110,100))
    image=im.resize((220,200),resample=Image.LANCZOS,box=(0,0,110,100))
    #使用resize對(duì)選中的區(qū)域進(jìn)行放大
    image.show()
    #保存
    image.save("./放大圖像.png")
    print("查看新圖像的尺寸",image.size)
except IOError:
    print("放大失敗")

圖片的放大效果如下所示:

圖2:局部放大操作

 注:這里選中的區(qū)域?yàn)榫幊酞{logo中的小獅子頭,原大小為(110,100),現(xiàn)大小為(220,200),這里進(jìn)行的是等比例放大,所以圖片沒(méi)有變形。


創(chuàng)建縮略圖

縮略圖(thumbnail image)指的是將原圖縮小至一個(gè)指定大?。╯ize)的圖像。通過(guò)創(chuàng)建縮略圖可以使圖像更易于展示和瀏覽。

Image 對(duì)象提供了一個(gè)? thumbnail()? 方法用來(lái)生圖像的縮略圖,該函數(shù)的語(yǔ)法格式如下:

thumbnail(size,resample)
  • size:元組參數(shù),指的是縮小后的圖像大??;
  • resample:可選參數(shù),指圖像重采樣濾波器,有四種過(guò)濾方式,分別是 ?Image.BICUBIC?(雙立方插值法)、PIL.Image.NEAREST(最近鄰插值法)、PIL.Image.BILINEAR(雙線性插值法)、PIL.Image.LANCZOS(下采樣過(guò)濾插值法),默認(rèn)為 Image.BICUBIC。

使用示例如下:

from PIL import Image
im = Image.open("../放大圖像.png")
im.thumbnail((100,100))
print("縮略圖尺寸",im.size)
#將縮略圖保存至桌面
im.save("./th.png")

輸出結(jié)果:

縮略圖尺寸 (100, 91)

注意,縮略圖的尺寸可能與您指定的尺寸不一致,這是因?yàn)?nbsp;Pillow 會(huì)對(duì)原圖像的長(zhǎng)、寬進(jìn)行等比例縮小,當(dāng)指定的尺寸不符合圖像的尺寸規(guī)格時(shí),縮略圖就會(huì)創(chuàng)建失敗, 比如指定的尺寸超出了原圖像的尺寸規(guī)格。


批量修改圖片尺寸

在圖像處理過(guò)程中,對(duì)于某些不需要精細(xì)處理的環(huán)節(jié),我們往往采用批量處理方法,比如批量轉(zhuǎn)換格式,批量修改尺寸,批量添加水印,批量創(chuàng)建縮略圖等,這是一種提升工作效率的有效途徑,它避免了單一、重復(fù)的操作。通過(guò) Pillow 提供的? Image.resize() ?方法可以批量地修改圖片尺寸,下面看一組簡(jiǎn)單的示例。

首先找一些類型相同,但尺寸不一的圖片,并把它們放入桌面的 image01 文件夾中。如下所示:

批量處理圖片

圖3:待處理的圖片

下面開始編寫代碼:

# 批量修改圖片尺寸
import os
from PIL import Image
#讀取圖片目錄
fileName = os.listdir('./image01/')
print(fileName)
#設(shè)定尺寸
width = 350
height = 350
# 如果目錄不存在,則創(chuàng)建目錄
if not os.path.exists('./NewImage/'):
    os.mkdir('./NewImage/')
# 循環(huán)讀取每一張圖片
for img in fileName:
    old_pic = Image.open('./image01/' + img)
    new_image = old_pic.resize((width, height),Image.BILINEAR)
    print (new_image)
    new_image.save('./NewImage/'+img)

輸出結(jié)果如下所示:

['向日葵.jpg', '國(guó)寶.jpg', '矩形圖.jpg', '蝴蝶.jpg']
<PIL.Image.Image image mode=RGB size=350x350 at 0x2B9E670>
<PIL.Image.Image image mode=RGB size=350x350 at 0x31D0C90>
<PIL.Image.Image image mode=RGB size=350x350 at 0x2B90DB0>
<PIL.Image.Image image mode=RGB size=350x350 at 0x31D0C90>

NewImage 目錄的內(nèi)容如下:

pillow圖像處理

圖4:處理完成的圖片


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)