Python 批量修改图片格式和尺寸
公司的一个项目要求把所有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 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
- #处理远程图片
- 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 批量修改图片格式和尺寸的更多相关文章
- Python批量修改图片格式和尺寸
Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ...
- python批量修改图片名称
import os class BatchRename(): def rename(self): # windows环境 """ os.rename() 方法用于命名文件 ...
- python 批量修改图片大小
一个文件夹下面有好多图片格式是jpg大小是1920*1080,把它们处理成1280*720并按原先图片的名保存在另一路径下这里首先要找到给定路径下所有的图片文件,然后在修改图片文件的大小,这里用到PI ...
- python 批量更换图片格式脚本
问题:将某文件下的所有jpg的图片更换为png的图片 简单的实现: # -*- coding:utf-8 -*- from os.path import splitext import glob fr ...
- python:批量修改文件名批量修改图片尺寸
批量修改文件名 参考博客:https://www.cnblogs.com/zf-blog/p/7880126.html 功能:批量修改文件名 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- 使用Adobe Photoshop CC 2015批量修改图片尺寸
最近在工作中遇到一个问题,当时客户给的图片尺寸与我要求的图片不符,由于图片非常的多,如果一张一张的修改,十分的麻烦,后来经过一位同事的指点,发现Adobe Photoshop CC 2015可以实现批 ...
- python 将png图片格式转换生成gif动画
先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...
- 【faster-rcnn】训练自己的数据——修改图片格式、类别
修改图片格式 matlab代码 其实内部一些代码是用了rbg的fast-rcnn代码的. \datasets\VOCdevkit2007\VOCcode\VOCinit.m里面,查找'jpg',改成' ...
- 利用python批量修改word文件名的方法示例
利用python批量修改word文件名的方法示例 最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完 ...
随机推荐
- django数据库操作-增删改查-多对多关系以及一对多(外键)关系
一.一对多(外键) 例子:一个作者对应多本书,一本书只有一个作者 model代码: class Person(models.Model); name = models.CharField('作者姓名' ...
- [ 原创 ] git使用技巧
Git的使用--如何将本地项目上传到Github Git分支图介绍 https://www.cnblogs.com/cheneasternsun/p/5952830.html https://www. ...
- luoguP3185 [HNOI2007]分裂游戏 枚举 + 博弈论
每个位置的瓶子中的每个石子是一个独立的游戏 只要计算出他们的\(sg\)值即可 至于方案数,反正不多\(n^3\)暴力枚举即可 反正怎么暴力都能过啊 复杂度\(O(Tn^3)\) #include & ...
- 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake
题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...
- elasticsearch实例讲解增删改查
1.首先弄明白四个概念 elasticsearch 关系型数据库 index 数据库 type 表 document 行 field 字段 如果刚一开始理解比较困难,那你就在心中默念100遍,10遍也 ...
- linux下安装MYSQL详细配置(转)
#tar zxvf mysql-5.0.18.tar.gz#cd mysql-5.0.18 #./configure --prefix=/usr/local/mysql --with-chars ...
- 用资源管理器右键编译 Visual Studio 解决方案文件
每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...
- crontab运行shell失败解决办法
1 首先检查crontab服务是否运行 可在crontab -e 中加入 */1 * * * * 123 >test.txt 可查看crontab服务是否启动,如果没有启动,请想办法启动 2 ...
- arcgis runtime 100 Create geometries
1 /* Copyright 2016 EsriEsri 2 * 3 * Licensed under the Apache License, Version 2.0 (the "Licen ...
- 技术交流:DDD在企业开发的案例分享
背景 因为工作上的原因,这次技术交流准备的不够充分,晚上通宵写的演示代码,不过整个过程还是收获蛮大的,具体如下: 对原子操作有了更深入的了解,自己写的无锁循环队列(有点类似 RingBuffer)终于 ...