python實(shí)現(xiàn)批量修改圖片格式和尺寸
本文實(shí)例為大家分享了python批量處理圖片的具體代碼,供大家參考,具體內(nèi)容如下
公司的一個項(xiàng)目要求把所有4096x4096的圖片全部轉(zhuǎn)化成2048x2048的圖片,這種批量轉(zhuǎn)換圖片大小的軟件網(wǎng)上很多,我的同事原來使用的美圖看看的批量轉(zhuǎn)換,但是稍微有點(diǎn)麻煩,每次還需要指定要轉(zhuǎn)換的圖片的輸入路徑和輸出路徑,而且每次都只能處理一個文件夾,很繁瑣,于是我想到了萬能的Python,然后寫了一個腳本來批量處理圖片,同一個根目錄下的所有文件夾的子文件等的圖片全部會處理掉。
代碼中還加入了很多的異常捕獲機(jī)制和提示,希望對大家有幫助。
備注:
1.導(dǎo)入了PIL庫,是處理圖片用的,很強(qiáng)大;
2.導(dǎo)入了win32庫,是判斷隱藏文件用的,我們的項(xiàng)目需要刪除隱藏文件,不需要的可以直接找到刪除。
3.導(dǎo)入send2trash庫,是把刪除的文件放進(jìn)垃圾箱,而不是永久刪除,這個我只是防止刪除有用的文件而搞得,有點(diǎn)嚴(yán)謹(jǐn)了是吧,不需要的可以刪掉啊。
4.我這個腳本是Python2.7編寫的,但是在處理中文編碼的時候非常惡心,盡管最后被我解決了,這個解決的方法,我隨后會再單獨(dú)寫一篇,但是此刻我是建議大家不要用2.x版本的python 了。據(jù)說3.x的版本的已經(jīng)解決了編碼的問題。希望大家聽我的建議。
#coding=utf-8 import sys import os, glob import platform import win32file,win32con from PIL import Image from send2trash import send2trash reload(sys) sys.setdefaultencoding('utf-8') #new_width =2048 #width =int(raw_input("the width U want:")) #imgslist = glob.glob(path+'/*.*') ShuiPing="水平" ShiZhuang="矢狀" GuanZhuang="冠狀" def Py_Log(_string): print "----"+_string.decode('utf-8')+"----" def is_windows_system(): return 'Windows' in platform.system() def is_hiden_file(file_Path): if is_windows_system(): fileAttr = win32file.GetFileAttributes(file_Path) if fileAttr & win32con.FILE_ATTRIBUTE_HIDDEN : return True return False return False def remove_hidden_file(file_path): send2trash(file_path) print "Delete hidden file path:"+file_path def astrcmp(str1,str2): return str1.lower()==str2.lower() def resize_image(img_path): try: mPath, ext = os.path.splitext(img_path) if (astrcmp(ext,".png") or astrcmp(ext,".jpg")): img = Image.open(img_path) (width,height) = img.size if(width != new_width): new_height = int(height * new_width / width) out = img.resize((new_width,new_height),Image.ANTIALIAS) new_file_name = '%s%s' %(mPath,ext) out.save(new_file_name,quality=100) Py_Log("圖片尺寸修改為:"+str(new_width)) else: Py_Log("圖片尺寸正確,未修改") else: Py_Log("非圖片格式") except Exception,e: print e #改變圖片類型 def change_img_type(img_path): try: img = Image.open(img_path) img.save('new_type.png') except Exception,e: print e #處理遠(yuǎn)程圖片 def handle_remote_img(img_url): try: request = urllib2.Request(img_url) img_data = urllib2.urlopen(request).read() img_buffer = StringIO.StringIO(img_data) img = Image.open(img_buffer) img.save('remote.jpg') (width,height) = img.size out = img.resize((200,height * 200 / width),Image.ANTIALIAS) out.save('remote_small.jpg') except Exception,e: print e def rename_forder(forder_path): Py_Log("------------rename_forder--------------------------") names = os.path.split(forder_path) try: if(unicode(ShuiPing) in unicode(names[1],'gbk')): os.rename(forder_path,names[0]+"\\"+"01") Py_Log(names[1]+"-->"+"01") if(unicode(ShiZhuang) in unicode(names[1],'gbk')): os.rename(forder_path,names[0]+"\\"+"02") Py_Log(names[1]+"-->"+"02") if(unicode(GuanZhuang) in unicode(names[1],'gbk')): os.rename(forder_path,names[0]+"\\"+"03") Py_Log(names[1]+"-->"+"03") except Exception,e: print e def BFS_Dir(dirPath, dirCallback = None, fileCallback = None): queue = [] ret = [] queue.append(dirPath); while len(queue) > 0: tmp = queue.pop(0) if(os.path.isdir(tmp)): ret.append(tmp) for item in os.listdir(tmp): queue.append(os.path.join(tmp, item)) if dirCallback: dirCallback(tmp) elif(os.path.isfile(tmp)): ret.append(tmp) if fileCallback: fileCallback(tmp) return ret def DFS_Dir(dirPath, dirCallback = None, fileCallback = None): stack = [] ret = [] stack.append(dirPath); while len(stack) > 0: tmp = stack.pop(len(stack) - 1) if(os.path.isdir(tmp)): ret.append(tmp) for item in os.listdir(tmp): stack.append(os.path.join(tmp, item)) if dirCallback: dirCallback(tmp) elif(os.path.isfile(tmp)): ret.append(tmp) if fileCallback: fileCallback(tmp) return ret def printDir(dirPath): print "dir: " + dirPath if(is_hiden_file(dirPath)): remove_hidden_file(dirPath) else: rename_forder(dirPath) def printFile(dirPath): print "file: " + dirPath resize_image(dirPath) return True if __name__ == '__main__': while True: path = raw_input("Path:") new_width =int(raw_input("the width U want:")) try: b = BFS_Dir(path , printDir, printFile) Py_Log ("\r\n **********\r\n"+"*********圖片處理完畢*********"+"\r\n **********\r\n") except: print "Unexpected error:", sys.exc_info() raw_input('press enter key to rehandle')
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)list反轉(zhuǎn)實(shí)例匯總
這篇文章主要介紹了Python實(shí)現(xiàn)list反轉(zhuǎn)的方法,實(shí)例總結(jié)了關(guān)于list的各種較為常見的操作技巧,需要的朋友可以參考下2014-11-11修改python plot折線圖的坐標(biāo)軸刻度方法
今天小編就為大家分享一篇修改python plot折線圖的坐標(biāo)軸刻度方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12PyTorch數(shù)據(jù)讀取的實(shí)現(xiàn)示例
這篇文章主要介紹了PyTorch數(shù)據(jù)讀取的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python可視化Matplotlib散點(diǎn)圖scatter()用法詳解
這篇文章主要介紹了Python可視化中Matplotlib散點(diǎn)圖scatter()的用法詳解,文中附含詳細(xì)示例代碼,有需要得朋友可以借鑒參考下,希望能夠有所幫助2021-09-09python輸入、數(shù)據(jù)類型轉(zhuǎn)換及運(yùn)算符方式
這篇文章主要介紹了python輸入、數(shù)據(jù)類型轉(zhuǎn)換及運(yùn)算符方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Python3.0 實(shí)現(xiàn)決策樹算法的流程
這篇文章主要介紹了Python3.0 實(shí)現(xiàn)決策樹算法的流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08