Python練習第四題,批量修改圖片解析度
第四題:你有一個目錄,裝了很多照片,把它們的尺寸變成都不大於 iPhone5 解析度(1136*640)的大小。
圖片來源:知乎專欄,就用以前抓取的吧
那麼下面就開始做吧
一、分析,可以使用Pillow來完成
首先我們先學習學習Pillow的相關用法,中文文檔 Pillow v2.4.0 (PIL fork)
然後我們需要修改圖片解析度,要先明白解析度是什麼意思,引用@Rio的回答。
我們通常說的『圖片解析度』(image resolution)其實是指『像素數』(pixel count),通常表達為橫向多少個像素x縱向多少個像素這樣。像 480x800 這樣的表述其實本來應該叫做尺寸(dimensions)的,但是因為數字圖片並沒有物理的長寬的概念,叫做尺寸反而可能會引起誤解。數字圖片的『寬』(width) 和『高』(height) 並非物理意義的長度單位,而是在兩個維度上圖片包含的像素個數。比如 480x800 這樣的圖片是由橫向 480 個像素、縱向 800 個像素(合計 384 000 個像素點)構成的。
作者:Rio
鏈接:圖片體積,圖片解析度,圖片尺寸之間是啥關係? - Rio 的回答 - 知乎來源:知乎著作權歸作者所有,轉載請聯繫作者獲得授權。
所以題目要求等於修改圖片大小為1136*640,簡單理解也就是把大小改為1136*640。
二、示例(glob、Image使用)
1、我們需要把目錄下的所有照片全部拿出來,這就要用到glob模塊
glob模塊是最簡單的模塊之一,內容非常少。用它可以查找符合特定規則的文件路徑名。跟使用windows下的文件搜索差不多。查找文件只用到三個匹配符:"*", "?", "[]"。"*"匹配0個或多個字元;"?"匹配單個字元;"[]"匹配指定範圍內的字元,如:[0-9]匹配數字。
glob.glob
返回所有匹配的文件路徑列表。它只有一個參數pathname,定義了文件路徑匹配規則,這裡可以是絕對路徑,也可以是相對路徑。下面是使用glob.glob的例子:
用法:
import glob n n#獲取指定目錄下的所有圖片 nprint (glob.glob(r"E:Picture**.jpg")) n n#獲取上級目錄的所有.py文件 nprint (glob.glob(r../*.py)) #相對路徑 n
2、處理圖片,使用PIL處理。
PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫, 導入 Image 模塊。然後通過 Image 類中的 open 方法即可載入一個圖像文件。如果載入文件失敗,則會引起一個 IOError ;若無返回錯誤,則 open 函數返回一個 Image 對象。現在,我們可以通過一些對象屬性來檢查文件內容,即:
>>> from PIL import Imagen>>> im=Image.open(rF:1.jpg)n>>> print(im.format,im.size,im.mode)nJPEG (640, 914) RGBn
這裡有三個屬性,我們逐一了解。
format : 識別圖像的源格式,如果該文件不是從文件中讀取的,則被置為 None 值。
size : 返回的一個元組,有兩個元素,其值為象素意義上的寬和高。
mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。
PIL的Image中提供了thumbnail(img,filter)方法,使用這個方法可以很方便的製作縮略圖。
官方文檔Pillow (PIL Fork) 4.1.0.dev0 documentation
看下簡單的用法
from PIL import Imagenimport glob, osnnsize = 128, 128nnfor infile in glob.glob("*.jpg"):n file, ext = os.path.splitext(infile)n im = Image.open(infile)n im.thumbnail(size)n im.save(file + ".thumbnail", "JPEG")n
三、代碼分享
import osnimport globnfrom PIL import Imagenndef thumbnail_pic(path):n a = glob.glob(r*.jpg)n for x in a:n name = os.path.join(path, x)n im = Image.open(name)n im.thumbnail((1136, 640))n print(im.format, im.size, im.mode)n im.save(name, JPEG)n print(Done!)nnif __name__ == __main__:n path = .n thumbnail_pic(path)n
更多:
from PIL import Imagenndef change_resolution(picPath, reslution):n img = Image.open(picPath)n x, y = img.sizen print x, yn changex = float(x) / reslution[0]n changey = float(y) / reslution[1]nn # 判斷解析度是否滿足n if changex > 1 or changey > 1:nn change = changex if changex > changey else changeyn print changen print int(reslution[0] / change), int(reslution[1] / change)n img.resize((int(x / change), int(y / change))).save(result.jpg)nnif __name__ == __main__:n change_resolution(pictest.jpg, (1136, 640))n
朋友們,你們還有更好的辦法嗎?
---------------------------------------------2-17更新------------------------------------------------------------------
@李宏傑 提出的使用Python的pathlib庫,文檔http://python.usyiyi.cn/translate/python_352/library/pathlib.html#module-pathlib
>>> p=Path(E:jiepaiji)n>>> list(p.glob(**/*.jpg))n[WindowsPath(E:/jiepai/ji/1.jpg), WindowsPath(E:/jiepai/ji/2.jpg), WindowsPath(E:/jiepai/ji/3.jpg), WindowsPath(E:/jiepai/ji/4.jpg), WindowsPath(E:/jiepai/ji/5.jpg), WindowsPath(E:/jiepai/ji/6.jpg), WindowsPath(E:/jiepai/ji/7.jpg), WindowsPath(E:/jiepai/ji/8.jpg)]n
在此目錄樹中列出所有jpg文件。
但是如何應用到本題中我還沒寫出來,功力不夠啊~
HTTPS://QR.ALIPAY.COM/FKX08420KBDE7QNKOBKFF2 (二維碼自動識別)
推薦閱讀:
※如何使用爬蟲獲取新加坡PSI信息?
※PyQt5系列教程(8):標準輸入對話框
※Cython 基本用法
TAG:Python |