公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图片的输入路径和输出路径,而且每次都只能处理一个文件夹,很繁琐,于是我想到了万能的Python,然后写了一个脚本来批量处理图片,同一个根目录下的所有文件夹的子文件等的图片全部会处理掉。
代码中还加入了很多的异常捕获机制和提示,希望对大家有帮助。
备注:
1.导入了PIL库,是处理图片用的,很强大;
2.导入了win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除。
3.导入send2trash库,是把删除的文件放进垃圾箱,而不是永久删除,这个我只是防止删除有用的文件而搞得,有点严谨了是吧,不需要的可以删掉啊。
4.我这个脚本是Python2.7编写的,但是在处理中文编码的时候非常恶心,尽管最后被我解决了,这个解决的方法,我随后会再单独写一篇,但是此刻我是建议大家不要用2.x版本的python 了。据说3.x的版本的已经解决了编码的问题。希望大家听我的建议。
- import sys  
- import os, glob  
- import platform  
- import win32file,win32con  
- from PIL import Image  
- from send2trash import send2trash  
-   
- reload(sys)  
- sys.setdefaultencoding(‘utf-8‘)  
-   
-   
- 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  
-   
- 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‘)  
 
Python 批量修改图片格式和尺寸
原文:http://www.cnblogs.com/zhoug2020/p/6701610.html