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

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

备注:

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

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

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

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

#coding=utf-8
import sys
import os, glob
import platform
import win32file,win32con
from PIL import Image
from send2trash import send2trashreload(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 Falsedef remove_hidden_file(file_path):send2trash(file_path)print "Delete hidden file path:"+file_pathdef 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.sizeif(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.sizeout = img.resize((200,height * 200 / width),Image.ANTIALIAS)out.save('remote_small.jpg')except Exception,e:print edef 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 edef 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 retdef 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 retdef printDir(dirPath):print "dir: " + dirPathif(is_hiden_file(dirPath)):remove_hidden_file(dirPath)else:rename_forder(dirPath)def printFile(dirPath):print "file: " + dirPathresize_image(dirPath)return Trueif __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 批量修改图片格式和尺寸相关推荐

  1. python批量修改图片格式和名称

    在制作数据集的过程中发现找到的图片名称和格式都很混乱,找了别人的发现老是报错. 同时总结了一下我自己这边程序报的错误: 1..jpg已存在** 比如我现在存在2.jpg,通过代码修改也会得到2.jpg ...

  2. Python批量修改图片名称,格式,并批量量化

    from PIL import Image import numpy as np import cv2 import matplotlib.pyplot as plt import os####### ...

  3. 【python】批量按坐标裁剪图片、ImageJ批量修改图片格式

    一.批量按坐标裁剪图片代码 # -- coding: utf-8 -- import cv2 import osdef update(input_img_path, output_img_path): ...

  4. python 批量修改图片大小

    python 批量修改图片大小 一个文件夹下面有好多图片格式是jpg大小是19201080,把它们处理成1280720并按原先图片的名保存在另一路径下 这里首先要找到给定路径下所有的图片文件,然后在修 ...

  5. 用Python批量修改图片名称及后缀名

    用Python批量修改图片名称及后缀名 import os a = 'dataset3\png/'//需要修改的图片所在的文件夹 b = 'dataset2\png/'//修改后的图片存放路径 fil ...

  6. python批量修改图片分辨率

    python批量修改图片分辨率 import cv2 import osif __name__ == '__main__':curDir = os.curdir # 获取当前执行python文件的文件 ...

  7. Python批量修改图片,刷新哈希值

    为什么要修改图片的哈希值? 如何修改图片的哈希值? 为什么要修改图片的哈希值? 上传一个文件到网盘时,网盘会检查该文件的哈希值,如果与网盘服务器上储存的某个文件的哈希值相同,说明该文件已经被上传过了, ...

  8. 用Python批量修改图片名称(后缀)

    当我们需要修改批量即几百幅图片的名称或后缀时,如果一个一个图片名称去重命名或是修改的话工作量就会很大.作为一名程序员,当然是要通过代码去解决这些繁琐的事情.下面是用python代码来实现批量修改图片名 ...

  9. 用Python批量修改图片大小的代码

    可以使用Python的PIL库来实现批量修改图片大小,示例代码如下: from PIL import Image # 加载图片 image = Image.open('filename') #修改图片 ...

最新文章

  1. php缓存数据到本地缓存,本地缓存localStorage的使用方法
  2. eureka同步原理_Eureka工作原理
  3. CMMI之需求管理和股票池管理
  4. 【Tiny4412】EMMC启动最小网络文件系统
  5. LoRa、Sigfox和NB-IoT在物联网趋势中谁是你的最佳拍档?
  6. 【SpringBoot 2】(四)详析SpringBoot的常用注解
  7. ThreadLocal可以解决并发问题吗?
  8. java reset_void reset()
  9. HDU 4553:约会安排(区间合并)
  10. RHCS Oracle HA for OEL5.8 KVM实践配置
  11. K8S终端UI界面--K9S
  12. 蓝桥杯c语言大一的知识够了吗,参加蓝桥杯后的感受以及个人总结
  13. python数据录入和分析_基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础
  14. mysql 报1055错误_MySQL数据库报1055错误
  15. Autocad2017破解版下载|Autodesk Autocad 2017中文破解版下载 64位(附注册机/序列号)
  16. cranberry病毒导致mycat应用都崩溃解决办法
  17. Ae:形状图层的内容添加
  18. easyui中datagrid表格如何正确显示和隐藏
  19. [渝粤教育] 西南科技大学 预算会计 在线考试复习资料2021版
  20. 爬虫入门学习(八)模拟登录丁香园论坛爬取用户信息

热门文章

  1. 计算机图形学中的经常使用模型
  2. 新功能发布—TSMaster如何实现J1939多帧报文收发
  3. java文件上传(tcp)
  4. Eclipse集成SVN报Failed to load JavaHL Library
  5. Android未接电话(未接电话个数,以及未接电话信息的读取)
  6. 计算机 打印机型号编码不可用,打印机型号编码显示不可用
  7. Python中文转换成二进制、八进制、十六进制输出
  8. 数据库第一范式、第二范式、第三范式、BCNF范式
  9. 腾讯、阿里之后,今日头条也入局的视频通信行业!
  10. CSDN为什么学生认证有些人显示学校名称,有些显示高校学生