Python 批量修改图片格式和尺寸

简介:

公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图片的输入路径和输出路径,而且每次都只能处理一个文件夹,很繁琐,于是我想到了万能的Python,然后写了一个脚本来批量处理图片,同一个根目录下的所有文件夹的子文件等的图片全部会处理掉。大笑

代码中还加入了很多的异常捕获机制和提示,希望对大家有帮助。

备注:

1.导入了PIL库,是处理图片用的,很强大;

2.导入了win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除。

3.导入send2trash库,是把删除的文件放进垃圾箱,而不是永久删除,这个我只是防止删除有用的文件而搞得,有点严谨了是吧,不需要的可以删掉啊。

4.我这个脚本是Python2.7编写的,但是在处理中文编码的时候非常恶心,尽管最后被我解决了,这个解决的方法,我随后会再单独写一篇,但是此刻我是建议大家不要用2.x版本的python 了。据说3.x的版本的已经解决了编码的问题。希望大家听我的建议。

[python]  view plain  copy 在CODE上查看代码片派生到我的代码片
    1. #coding=utf-8  
    2. import sys  
    3. import os, glob  
    4. import platform  
    5. import win32file,win32con  
    6. from PIL import Image  
    7. from send2trash import send2trash  
    8.   
    9. reload(sys)  
    10. sys.setdefaultencoding('utf-8')  
    11.   
    12. #new_width =2048  
    13. #width =int(raw_input("the width U want:"))  
    14. #imgslist = glob.glob(path+'/*.*')  
    15.   
    16. ShuiPing="水平"  
    17. ShiZhuang="矢状"  
    18. GuanZhuang="冠状"  
    19.   
    20. def Py_Log(_string):  
    21.     print "----"+_string.decode('utf-8')+"----"  
    22.   
    23. def is_windows_system():  
    24.     return 'Windows' in platform.system()  
    25.   
    26. def is_hiden_file(file_Path):   
    27.     if is_windows_system():   
    28.         fileAttr = win32file.GetFileAttributes(file_Path)  
    29.         if fileAttr & win32con.FILE_ATTRIBUTE_HIDDEN :   
    30.             return True   
    31.         return False   
    32.     return False  
    33.   
    34. def remove_hidden_file(file_path):  
    35.     send2trash(file_path)  
    36.     print "Delete hidden file path:"+file_path  
    37.   
    38. def astrcmp(str1,str2):  
    39.     return str1.lower()==str2.lower()  
    40.   
    41. def resize_image(img_path):  
    42.     try:  
    43.         mPath, ext = os.path.splitext(img_path)  
    44.         if (astrcmp(ext,".png") or astrcmp(ext,".jpg")):  
    45.             img = Image.open(img_path)  
    46.             (width,height) = img.size  
    47.               
    48.             if(width != new_width):  
    49.                 new_height = int(height * new_width / width)  
    50.                 out = img.resize((new_width,new_height),Image.ANTIALIAS)  
    51.                 new_file_name = '%s%s' %(mPath,ext)  
    52.                 out.save(new_file_name,quality=100)  
    53.                 Py_Log("图片尺寸修改为:"+str(new_width))  
    54.             else:  
    55.                 Py_Log("图片尺寸正确,未修改")  
    56.         else:  
    57.             Py_Log("非图片格式")  
    58.     except Exception,e:  
    59.         print e  
    60.   
    61. #改变图片类型  
    62. def change_img_type(img_path):  
    63.     try:  
    64.         img = Image.open(img_path)  
    65.         img.save('new_type.png')  
    66.     except Exception,e:  
    67.         print e  
    68.   
    69. #处理远程图片  
    70. def handle_remote_img(img_url):  
    71.     try:  
    72.         request = urllib2.Request(img_url)  
    73.         img_data = urllib2.urlopen(request).read()  
    74.         img_buffer = StringIO.StringIO(img_data)  
    75.         img = Image.open(img_buffer)  
    76.         img.save('remote.jpg')  
    77.         (width,height) = img.size  
    78.         out = img.resize((200,height * 200 / width),Image.ANTIALIAS)  
    79.         out.save('remote_small.jpg')  
    80.     except Exception,e:  
    81.         print e  
    82.   
    83. def rename_forder(forder_path):  
    84.     Py_Log("------------rename_forder--------------------------")  
    85.     names = os.path.split(forder_path)  
    86.     try:  
    87.         if(unicode(ShuiPing) in unicode(names[1],'gbk')):  
    88.             os.rename(forder_path,names[0]+"\\"+"01")  
    89.             Py_Log(names[1]+"-->"+"01")  
    90.         if(unicode(ShiZhuang) in unicode(names[1],'gbk')):  
    91.             os.rename(forder_path,names[0]+"\\"+"02")  
    92.             Py_Log(names[1]+"-->"+"02")  
    93.         if(unicode(GuanZhuang) in unicode(names[1],'gbk')):  
    94.             os.rename(forder_path,names[0]+"\\"+"03")  
    95.             Py_Log(names[1]+"-->"+"03")  
    96.     except Exception,e:  
    97.         print e  
    98.   
    99. def BFS_Dir(dirPath, dirCallback = None, fileCallback = None):  
    100.     queue = []  
    101.     ret = []  
    102.     queue.append(dirPath);  
    103.     while len(queue) > 0:  
    104.         tmp = queue.pop(0)  
    105.         if(os.path.isdir(tmp)):  
    106.             ret.append(tmp)  
    107.             for item in os.listdir(tmp):  
    108.                 queue.append(os.path.join(tmp, item))  
    109.             if dirCallback:  
    110.                 dirCallback(tmp)  
    111.         elif(os.path.isfile(tmp)):  
    112.             ret.append(tmp)  
    113.             if fileCallback:  
    114.                 fileCallback(tmp)  
    115.     return ret  
    116.   
    117. def DFS_Dir(dirPath, dirCallback = None, fileCallback = None):  
    118.     stack = []  
    119.     ret = []  
    120.     stack.append(dirPath);  
    121.     while len(stack) > 0:  
    122.         tmp = stack.pop(len(stack) - 1)  
    123.         if(os.path.isdir(tmp)):  
    124.             ret.append(tmp)  
    125.             for item in os.listdir(tmp):  
    126.                 stack.append(os.path.join(tmp, item))  
    127.             if dirCallback:  
    128.                 dirCallback(tmp)  
    129.         elif(os.path.isfile(tmp)):  
    130.             ret.append(tmp)  
    131.             if fileCallback:  
    132.                 fileCallback(tmp)  
    133.     return ret  
    134.   
    135. def printDir(dirPath):  
    136.     print "dir: " + dirPath  
    137.     if(is_hiden_file(dirPath)):  
    138.         remove_hidden_file(dirPath)  
    139.     else:  
    140.         rename_forder(dirPath)  
    141.   
    142. def printFile(dirPath):  
    143.     print "file: " + dirPath  
    144.     resize_image(dirPath)  
    145.     return True  
    146.   
    147.   
    148. if __name__ == '__main__':  
    149.     while True:  
    150.         path = raw_input("Path:")  
    151.         new_width =int(raw_input("the width U want:"))  
    152.         try:  
    153.             b = BFS_Dir(path , printDir, printFile)  
    154.             Py_Log ("\r\n          **********\r\n"+"*********图片处理完毕*********"+"\r\n          **********\r\n")  
    155.         except:  
    156.             print "Unexpected error:", sys.exc_info()  
    157.         raw_input('press enter key to rehandle')  
本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/6701610.html,如需转载请自行联系原作者
相关文章
|
1月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1419 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
24天前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
26 1
|
25天前
|
计算机视觉 Python
Python实用记录(一):如何将不同类型视频按关键帧提取并保存图片,实现图片裁剪功能
这篇文章介绍了如何使用Python和OpenCV库从不同格式的视频文件中按关键帧提取图片,并展示了图片裁剪的方法。
54 0
|
3月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
267 1
|
24天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
97 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
24天前
|
Python
Python实用记录(四):os模块-去后缀或者改后缀/指定目录下图片或者子目录图片写入txt/csv
本文介绍了如何使用Python的os模块来操作文件,包括更改文件后缀、分割文件路径和后缀、将指定目录下的所有图片写入txt文档,以及将指定目录下所有子目录中的图片写入csv文档,并为每个子目录分配一个标签。
15 1
|
28天前
|
编解码 UED Python
Python批量修改指定目录下图片的大小名文章
Python批量修改指定目录下图片的大小名文章
15 1
|
30天前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
1月前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
25 1
|
2月前
|
数据采集 开发者 Python
Python之怎么爬取图片网站
Python之怎么爬取图片网站