How do I resize an image using PIL and maintain its aspect ratio?

Posted in :

我有一個資料夾,裡的圖檔是 96×96, 我希望在這一個資料夾下的檔案被異動時,會自動產生縮圖(64×64)到其他的資料夾下。

Screenshot 2016-06-30 06.51.12

PIL 是 Python 下最有名的影像處理套件。

http://pillow.readthedocs.io/en/3.0.x/index.html

這個套件,似乎在升級改版本,把一些比較少人用的屬性或方法在新版本裡拿掉,新版本也加入了更多新的功能。一般人應該都只會使用基本功能,有需要使用進階功能的時候可能要留意 PIL 的版本。


範例1號:縮圖

#!/usr/bin/env python
#encoding=utf-8

from PIL import Image

im = Image.open( “tab_icon_countrys.png” )
print im.size

width = 64
ratio = float(width)/im.size[0]
height = int(im.size[1]*ratio)
nim = im.resize( (width, height), Image.BILINEAR )
print nim.size
nim.save( “resized.png” )

執行結果:

(96, 96)
(64, 64)

說明:

原本圖檔 tab_icon_countrys.png 是 96×96, 等比率縮成 64×64.


列出目前目錄下的 *.png 檔案:

#!/usr/bin/env python

#encoding=utf-8

from glob import glob

from os.path import splitext

from PIL import Image

imagelist = glob( “*.[pP][nN][gG]” )

for img in imagelist:

    im = Image.open(img)

    png = splitext(img)[0]+“-thumbnail.png”

    #im.save(png)

    print png


把 sample 1 + sample 2 結合起來,取得 sample 3號:

#!/usr/bin/env python

#encoding=utf-8

from glob import glob

from os.path import splitext

from PIL import Image

imagelist = glob( “*.[pP][nN][gG]” )

for img in imagelist:

    im = Image.open(img)

    filename = splitext(img)[0] + “.png”

    print “Filename: “ + filename

    width = 96

    png_filepath = “../drawable-xxhdpi/” + filename

    nim = im.resize( (width, width), Image.BILINEAR )

    nim.save(png_filepath)


安裝Pillow

在命令行下直接通過pip安裝:

pip install pillow

python -m pip install pillow

如果遇到Permission denied安裝失敗,請加上sudo重試。如果同時有 python2 + python3 請把上面的 python 換成 python3 即可。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *