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