python实现批量修改图片格式和尺寸
作者:PassionY 发布时间:2021-02-12 10:47:35
标签:python,图片格式,批量修改
本文实例为大家分享了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')
来源:https://blog.csdn.net/yupu56/article/details/50569781
0
投稿
猜你喜欢
- 这年头,信息和获得信息的渠道越来越多。随着信息量的增大,先有了分类,又有了导航,再有了搜索,后面的发展还不得而知。在此只是根据平日的所看所想
- 有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页
- 我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们
- global.asa<SCRIPT LANGUAGE=VBScript RUNAT=Server>Sub&n
- 标量(scalar)数据类型标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:. number. character. da
- 一、基本思想本文思想是基于用asp和DOM来读取和存储XML数据,并利用XML数据来存储留言信息,达到同用数据库存储数据的功能。二、XML留
- 选项default-charaset-set=utf8;然后创建一个数据表 create table a_table(b varchar(2
- 浏览器经常Cache你的页面,这是一个很麻烦的问题,下面先提出几种方案来解决一般的问题:(把下面的代码加入到asp程序的最开始位置)<
- 父层: <div class="col-xs-12"> <div class
- 数据库服务器主要用于存储、查询、检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性、可靠性和稳定性等方面都有很高的要求。下面
- 动机: 查询功能是我们在网站上见过的最普遍也是最常用的一个功能模块了。以往的信息查询都是连接到数据库的,每一次点击都必须要后台数据库的支持。
- 此文章主要介绍的是MySQL数据库的字符(串)的实际操作步骤,我们大家都知道MySQL数据库的字符(串)在实际操作是经常被用到了,所以你对其
- 本文实例讲述了PHP基于非递归算法实现先序、中序及后序遍历二叉树操作。分享给大家供大家参考,具体如下:概述:二叉树遍历原理如下:针对上图所示
- asp之家注:有时候我们需要知道我们链接的远程图片是否正常,是否存在,当不存在时如果我们继续引用,就会在网页上留个大大的X,影响了页面美观。
- 在SQL Server中进行开发会让你身处险地,并且寻找快速解决方案。我们编辑了前十名关于SQL Server开发的常见问题。对常见的针对表
- 序 号前 缀使用的变量/范围或数据类型1a or arrArray2b or blnBoolean3bytByte4
- 又发一个js版幻灯片,接口比较少,但功能和外观都还不错的,可自定义切换时间:)method: adRotator.initialize(容器
- 网络上有很多个性化的404页面,但是404页面不仅仅是个性化展示,404页面本来目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用
- 在上一篇文章中,我介绍了MySQL对XML支持的部分功能,包括--xml命令行选项,以及MySQL 5.1.5中开始引入的新功能。今天我将介
- 新手,看到很多网页上有显示/隐藏的菜单,可以显示隐藏层的同时控制FLASH的播放与停止。找了好久都找不到这个功能。。。还望高人指点当点击时就