python暢玩os模塊以及順便批量修改圖片尺寸
最近gif做不了,找了很久終于發(fā)現(xiàn)了原因。
原來是!圖 片 尺 寸 沒 有 統(tǒng) 一!
說了也奇怪,之前制作的好好的現(xiàn)在突然就說要尺寸一致才行,那沒辦法了,只好從了。
誰叫他功能強(qiáng)呢?(這個(gè)軟件叫ScreenToGif,在制作gif方面確實(shí)沒的說。)
之前截圖雖然有參考線,但畢竟也是手動(dòng)截圖的,所以還是會(huì)有一點(diǎn)點(diǎn)偏差。于是百度了諸多方法,都說用什么photoshop能批量修改圖片尺寸,結(jié)果不還是要一個(gè)一個(gè)去點(diǎn)呢?
后知后覺,python功能這么強(qiáng)大,有難得倒python的嗎?
身為python愛好者,必須用python搞起來!
修改圖片用到的模塊是PIL,而在修改圖片的過程中OS模塊起到非常重要的作用。OS模塊相當(dāng)于跑腿的,找到好看點(diǎn)的木頭送給雕工師傅雕刻,而雕工師傅就是PIL了,OS模塊就是讓雕工師傅發(fā)現(xiàn)合適木頭。哎,與其說師傅與木頭,不如說伯樂和千里馬吧,哈哈哈..
文章介紹
在批量修改圖片尺寸的過程中,我們需要用到OS模塊諸多方法。
因此,在這里我以實(shí)現(xiàn)修改圖片尺寸為目標(biāo),著重講解一下OS模塊如何運(yùn)用到實(shí)際需求中。
OS模塊
簡介
os(operating system)模塊是提供各種 Python 程序與操作系統(tǒng)進(jìn)行交互的接口。
常用功能
- 獲取信息:OS模塊能獲取路徑,目錄名,文件名。
- 修改信息:OS模塊能添加路徑,創(chuàng)建目錄,更改目錄名/文件名, 刪除目錄,刪除文件
(典型的增刪改查)
▲(附)os.path
os下面有個(gè)比較常用的path模塊,這模塊的能幫助你更好的處理文件。它有什么作用呢?
1.判斷
abspath表示返回絕對(duì)路徑。
- 判斷路徑是否存在
os.path.exists(abspath)
- 判斷是否是文件/目錄 (當(dāng)路徑存在時(shí)才進(jìn)行判斷,否則返回False)
os.path.isdir(abspath) / os.path.isfile(abspath)
2.提供標(biāo)準(zhǔn)格式的字符串。
以下操作均不考慮路徑/名稱是否有效,只是單純提供處理過的字符串。
- 將多個(gè)路徑合并成一個(gè)路徑。
?os.path.join(A,B[,..])
AB均表示路徑。該函數(shù)相當(dāng)于
?r"\\".join((A,B)) ?# 此處必須兩個(gè)括號(hào),第一個(gè)括號(hào)表示join方法,第二個(gè)括號(hào)表示元組
當(dāng)給的路徑出現(xiàn)多個(gè)盤符時(shí)(不合法路徑),取最后一個(gè)盤符之后的路徑。、
- 提供絕對(duì)路徑。
os.path.abspath(path)
默認(rèn)是返回你工作目錄加上你傳進(jìn)去的路徑。
- 返回最底層文件/目錄名 或 除最底層文件/目錄的目錄。
# 返回文件/目錄名 >>> print(os.path.basename("lishuaige//jiu//shi//shuai//ya")) ya # 返回文件/目錄名的目錄 >>> print(os.path.dirname("lishuaige//jiu//shi//shuai//ya")) lishuaige//jiu//shi//shuai
os.path模塊終究只能用來看,真正能對(duì)文件修改的還是OS模塊。
創(chuàng)建/刪除 目錄/文件
1.創(chuàng)建 目錄(Create directory)/ 文件
os.mkdir(abspath) # 創(chuàng)建一層目錄 os.makedirs(abspath) # 創(chuàng)建多層目錄需要用makedirs否則會(huì)報(bào)錯(cuò)。
而創(chuàng)建文件是使用常規(guī)的with open方法,注意,創(chuàng)建文件時(shí)的文件目錄必須已存在,否則會(huì)報(bào)錯(cuò)
with open(r'C:\Users\17591\Desktop\c.txt', 'w+') as fp: fp.write("lishuaige")
2.刪除目錄
os.removedirs(abspath) # 遞歸刪除空目錄也只能刪除空目錄,否則會(huì)報(bào)錯(cuò)
注意:刪除是自深向淺刪除直到遇到空文件停止。
os.rmdir(abspath) # 刪除一個(gè)目錄
3.刪除文件
os.remove(abspath)? # 刪除的必須是文件而不是目錄,否則會(huì)報(bào)錯(cuò)
更改 目錄/文件 名/位置
無論是文件還是目錄,都是使用os.rename方法進(jìn)行改名。
這命令不僅能改名,還能將文件/目錄移動(dòng)到其他位置(前提是這個(gè)位置的上一層目錄已經(jīng)存在)。
os.rename(原絕對(duì)路徑,新絕對(duì)路徑)
▲獲取 路徑/目錄/文件 名
1.獲取指定路徑下的目錄和文件名
os.listdir(abspath)
返回一個(gè)列表,文件名與目錄名都在里面。
2.★os.walk函數(shù)
這個(gè)函數(shù)功能強(qiáng)大的不行,就像它名字一樣,隨便逛隨便看os系統(tǒng)信息,因此它的作用是能遞歸地獲取目錄下的所有信息(路徑/目錄/文件名)。(它借助了os.listdir函數(shù))
批量處理圖片尺寸
了解OS模塊之后我們就要開始干正事了。
實(shí)現(xiàn)思路
首先要新建一個(gè)目錄用于存放修改后的圖片。我們的目的是統(tǒng)一圖片尺寸,因?yàn)槲覀兠繌垐D片的大小都比較接近,所以我們以第一張圖片的大小作為標(biāo)準(zhǔn),將其余圖片的大小設(shè)置成第一張圖片的尺寸。然后保存到新建的目錄當(dāng)中。
(在圖片大小與修改后的大小不一致的情況下,原圖會(huì)經(jīng)過一定比例放大或縮小得到修改后的圖片,因此無需擔(dān)心圖片內(nèi)容的丟失。)
注意:如果傳入的路徑存在多個(gè)圖片文件夾,我們希望在每個(gè)存有圖片的文件夾里面都新建一個(gè)文件夾來存放修改后的圖片。
詳細(xì)步驟
安裝PIL庫
進(jìn)入pycharm的terminal 或 cmd命令行
輸入
pip install pillow
即可完成安裝PIL庫。
創(chuàng)建文件夾
我們需要?jiǎng)?chuàng)建一個(gè)文件夾用來保存修改后的圖片。如果這個(gè)文件夾已經(jīng)存在的話,我們需要?jiǎng)h除里面的文件。怎么刪除?第一個(gè)方法是使用shutil的rmtree函數(shù)刪除整個(gè)文件夾后再使用os.mkdir函數(shù)創(chuàng)個(gè)新的,第二個(gè)方法是使用我們os.walk函數(shù)逐步刪除里面所有文件,但這樣比較繁瑣,如果遇到多個(gè)目錄的時(shí)候刪起來就難受了,所以還是用rmtree刪除實(shí)在些。
因此我們定義一個(gè)創(chuàng)建文件夾作為輸出路徑的方法。
在遇到第一張圖片時(shí)所在的目錄創(chuàng)建(可能會(huì)在不同目錄創(chuàng)建,取決于你傳入的路徑含有的圖片文件夾。每存在一個(gè)圖片文件夾就會(huì)在里面創(chuàng)建一個(gè)存放修改后圖片的文件夾)
# 如果已存在文件夾則清空文件,否則創(chuàng)建一個(gè)新的 def initialize_folder(output_folder): print("初始化..") if os.path.exists(output_folder): shutil.rmtree(output_folder) os.mkdir(output_folder) print("初始化文件夾 %s 成功!" % (output_folder.split(os.sep)[-1]))
批量處理
我們使用os.walk遍歷圖片文件夾,如果文件是圖片的格式的話,我們獲取他的文件路徑并確定導(dǎo)出路徑。如果是第一張圖片的話我們還需要初始化文件夾,以及獲取圖片尺寸。最后將圖片尺寸,路徑和保存路徑交給PIL模塊處理。最后給出些人性化提示。
# path: 圖片文件夾路徑 fname: 保存修改文件的目錄名 def file_handling(path, fname): for dir_path, listdir, files in os.walk(path): # 根據(jù)目錄路徑獲取目錄名 os.sep表示分割符 dir_name = dir_path.split(os.sep)[-1] # 如果此時(shí)的目錄跟保存路徑一致,那么需要跳過 if dir_name == fname: continue print("正在處理 %s 文件夾文件..\n" % dir_name) # 設(shè)置進(jìn)度 rate = 1 # 記錄總數(shù) c = len(files) for file in files: # 如果后綴名不是圖片格式則需要跳過 if file.split('.')[-1].lower() not in "pngjpgjpeg": continue # 文件路徑 file_path = os.path.join(dir_path, file) # 保存路徑 export_path = os.path.join(dir_path, fname, file) if rate == 1: # 初始化文件夾 用于存放修改后的圖片 initialize_folder(os.path.join(dir_path, fname)) img = Image.open(file_path) width = img.size[0] height = img.size[1] # 交給雕工師傅 resize_image(file_path, export_path, width, height) print("已完成 {:.2f} %\t{:d}個(gè)文件".format(rate / c * 100, rate)) rate += 1 print("保存成功!")
修改圖片尺寸
三步走戰(zhàn)略:打開->修改->保存。
我們修改圖片尺寸使用的是PIL下面的Image模塊的方法,需要提前導(dǎo)入。
from PIL import Image
最后使用resize方法修改大小即可,resize顧名思義,修改尺寸。
# 修改圖片大小 def resize_image(file_path, export_path, width, height): img = Image.open(file_path) # Image.ANTIALIAS:抗鋸齒,提高圖片質(zhì)量 r = img.resize((width, height), Image.ANTIALIAS) r.save(export_path)
主函數(shù)
作為函數(shù)的入口需要確定圖片路徑及目錄名,然后調(diào)用以上方法。
if __name__ == '__main__': # 獲取存放圖片總路徑 path = r'%s' % (input("請(qǐng)將您的存放圖片的路徑復(fù)制于此:")) # 指定輸出文件夾名 fname = r'lishuaige' file_handling(path, fname)
完整代碼
from PIL import Image import os import shutil # 修改圖片大小 def resize_image(file_path, export_path, width, height): img = Image.open(file_path) # Image.ANTIALIAS:抗鋸齒,提高圖片質(zhì)量 r = img.resize((width, height), Image.ANTIALIAS) r.save(export_path) # 如果已存在文件夾則清空文件,否則創(chuàng)建一個(gè)新的 def initialize_folder(output_folder): print("初始化..") if os.path.exists(output_folder): shutil.rmtree(output_folder) os.mkdir(output_folder) print("初始化文件夾 %s 成功!" % (output_folder.split(os.sep)[-1])) # path: 圖片文件夾路徑 fname: 保存修改文件的目錄名 def file_handling(path, fname): for dir_path, listdir, files in os.walk(path): # 根據(jù)目錄路徑獲取目錄名 os.sep表示分割符 dir_name = dir_path.split(os.sep)[-1] # 如果此時(shí)的目錄跟保存路徑一致,那么需要跳過 if dir_name == fname: continue print("正在處理 %s 文件夾文件..\n" % dir_name) # 設(shè)置進(jìn)度 rate = 1 # 記錄總數(shù) c = len(files) for file in files: # 如果后綴名不是圖片格式則需要跳過 if file.split('.')[-1].lower() not in "pngjpgjpeg": continue # 文件路徑 file_path = os.path.join(dir_path, file) # 保存路徑 export_path = os.path.join(dir_path, fname, file) if rate == 1: # 初始化文件夾 用于存放修改后的圖片 initialize_folder(os.path.join(dir_path, fname)) img = Image.open(file_path) width = img.size[0] height = img.size[1] # 交給雕工師傅 resize_image(file_path, export_path, width, height) print("已完成 {:.2f} %\t{:d}個(gè)文件".format(rate / c * 100, rate)) rate += 1 print("保存成功!") if __name__ == '__main__': # 獲取存放圖片總路徑 path = r'%s' % (input("請(qǐng)將您的存放圖片的路徑復(fù)制于此:")) # 指定輸出文件夾名 fname = r'lishuaige' file_handling(path, fname)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python自動(dòng)化辦公操作PPT的實(shí)現(xiàn)
這篇文章主要介紹了python自動(dòng)化辦公操作PPT的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python 多繼承中的一個(gè)詭異現(xiàn)象 既是 Father又是grandfather
我們知道,在面向?qū)ο缶幊汤锩?,繼承是一個(gè)很重要的概念。子類可以使用父類的方法和屬性,接下來小編將用舉例的方式為大家講解Python 多繼承中的一個(gè)詭異現(xiàn)象 其即是爸爸又是爺爺?shù)钠孑猬F(xiàn)象,感興趣的小伙伴可以看下面文章具體了解2021-09-09python調(diào)用百度語音識(shí)別實(shí)現(xiàn)大音頻文件語音識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度語音識(shí)別實(shí)現(xiàn)大音頻文件語音識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08