一、思路分析

其实,照片处理要求很简单,主要是两个方面:一个是调整图片尺寸(即宽x高),另一个是调整图片的大小(即压缩)。为了实现这两个功能,利用python中的PIL库即可,其安装方法如下:

pip install pillow

说明:PIL官方版不支持python3,不过非官方pillow可作为其替代品。
导入相关的库:

from PIL import Image

读取图片:

image = Image.open('xxx.jpg')

利用resize()函数即可对图片的尺寸进行调整:

image = image.resize((width, height))

其中width和height分别为预期调整的图片宽和图片高。

利用save()函数即可对图片进行压缩,进而调整其大小:

image.save('out.jpg', quality=60)

其中quality表示压缩的比例。

二、调整尺寸

首先一个函数,用于调整图片的尺寸:

def resize(inImage, width, height, inplace=False):
'''
将图片调整为指定尺寸
----------------------------
参数 inImage:需要处理的图片地址
参数 width:预期图片宽度
参数 height:预期图片高度
参数 inplace:是否覆盖原文件
----------------------------
返回 outImage:压缩后的图片地址
'''
if not inplace: # 如果不覆盖
outImage = '%s-out.%s'%(inImage.split('.')[0],inImage.split('.')[1])
else:
outImage = inImage
image = Image.open(inImage)
image = image.resize((width, height))
image.save(outImage)
print('"%s"调整成功!(尺寸:%dx%d)'%(inImage, width, height))
return outImage

三、调整大小

首先定义一个函数,用于获取图片的文件大小:

def get_size(fileName):
'''
获取图片文件的大小(KB)
--------------------
参数 fileName: 文件名
--------------------
返回 fileSize:文件的大小
'''
fileSize = os.path.getsize(fileName)
fileSize /= 1024 # 将单位转为KB
return fileSize

然后,通过不断调整压缩比率quality,来使得图片到达指定的大小,具体过程如下:

def compress(inImage, targetSize, step=5, quality=75, inplace=False):
'''
将图片压缩到指定的大小
-------------------------------
参数 inImage:需要处理的图片地址
参数 targetSize:预期压缩的大小
参数 step:每次迭代的压缩比
参数 quality:初始压缩比
参数 inplace:是否覆盖原文件
-------------------------------
返回 outImage:压缩后的图片地址
'''
if not inplace: # 如果不覆盖
outImage = '%s-out.%s'%(inImage.split('.')[0], inImage.split('.')[1])
else:
outImage = inImage
fileSize = get_size(inImage)
while fileSize > targetSize:
image = Image.open(inImage)
image.save('temp.jpg', quality=quality)
fileSize = get_size('temp.jpg')
quality -= step # 调整压缩比
if quality < 0:
print('"%s"压缩失败!(请调整step)'%inImage)
return
if os.path.exists('temp.jpg'):
copyfile('temp.jpg',outImage)
os.remove('temp.jpg') # 移处临时文件
print('"%s"压缩成功!(大小:%.2fKB)'%(inImage, fileSize))
return outImage

四、整合代码

将resize()和compress()两个函数整合到一起:

def adjust(inImage, width, height, targetSize, inplace=False):
'''
将图片调整为指定格式(包括尺寸及大小)
-------------------------------
参数 inImage:需要处理的图片地址
参数 width:预期图片宽度
参数 height:预期图片高度
参数 targetSize:预期压缩的大小
参数 inplace:是否覆盖原文件
-------------------------------
返回 outImage:调整后的图片地址
'''
if not inplace: # 如果不覆盖
outImage = '%s-out.%s'%(inImage.split('.')[0],inImage.split('.')[1])
else:
outImage = inImage
resize(inImage, width, height, inplace=inplace)
compress(outImage, targetSize, inplace=True)
return outImage

调用方法如下:

if __name__ == '__main__':
adjust('xxx.jpg', 600, 800, 100)

随后,通过写一个循环,将压缩包里的所有图片进行处理,便得到了预期的格式。

写在最后

其实,这个小工具还有许多可以完善的地方,比如针对压缩方式、图片质量、效率等等都能做一些优化。此外,当然也可以考虑做一个GUI以更加方便的操作。

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!

用python写图片格式批量处理工具的更多相关文章

  1. —用python写图片格式批量处理工具

    python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址 2.解析页面中的微博地址 3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论 ...

  2. Python 写了一个批量生成文件夹和批量重命名的工具

    Python 写了一个批量生成文件夹和批量重命名的工具 目录 Python 写了一个批量生成文件夹和批量重命名的工具 演示 功能 1. 可以读取excel内容,使用excel单元格内容进行新建文件夹, ...

  3. 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)

    一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...

  4. 利用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...

  5. python之简单主机批量管理工具

    今天做了一个很简单的小项目,感受到paramiko模块的强大. 一.需求 二.简单需求分析及流程图 需求很少,我就简单地说下: 1. 主机分组可以配置文件实现(我用字典存数据的). 2. 登陆功能不做 ...

  6. [ Python - 10 ] 练习:批量管理主机工具

    需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ## 需求: 主机分组 登录后显示主机分组,选择分组后查 ...

  7. 基于pyqt5的图片素材批量处理工具

    功能 分辨率的批量转换,文件夹递归查找 像素偏移量批量调整,文件夹单层查找 画布的大小的批量进行调整,不进行缩放,文件夹单层查找 界面 通过PyUIC生成的代码 # -*- coding: utf-8 ...

  8. python转换图片格式

    在图片所在的路径下,打开命令窗口 bmeps -c picturename.png picturename.eps

  9. 2017.11.7 Python 制作EFM32/ AVR批量烧录工具

    Customer need program quickly asap. ok,I need to set up a table for test. 1 reference data http://ww ...

随机推荐

  1. python自动化测试pytest框架

    pytest和unittest都是python中的测试框架,pytest相比unittest 更加的灵活,具体体现在 以下几点 1.写测试方法时不用继承类 2.前置后置放在一起 2.1如果是全局共享的 ...

  2. 紧急发布用cherry-pick检出当前分支所有我的提交记录

    目录 背景 操作命令 cherry-pick git log Shell脚本 背景 公司接了个新项目,需在平台上增加几个新接口,问题是本来说是和平台一起迭代发布的时间提前了,但当前的代码都和其他开发人 ...

  3. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计

    摘要:本文主要是探讨OLAP关系型数据库框架的数据仓库平台如何设计双集群系统,即增强系统高可用的保障水准,然后讨论一下GaussDB(DWS)的容灾应该如何设计. 当前社会.企业运行当中,大数据分析. ...

  4. 【译】用 React 和 D3 创建图表

    本文翻译自:https://dzone.com/articles/charts-with-modern-react-and-d3 本文将介绍如何利用 D3JS 和 ReactJS 来创建基础图表. R ...

  5. apply 、call 以及 bind 的使用和区别

    一.被apply和call调用的函数中没有传递参数 (一)不传参数 结果: (二)传递 null 结果: 总结: 1.当使用 apply和 call去调用函数并且没有传递参数时,前提这个函数中也没有传 ...

  6. VS2019配置C+++mingW32配置

    两个安装教程博客 http://t.sg.cn/yq22mn http://t.sg.cn/wsavo0 基于调试报错,是因为文件夹是中文,贴一个详细的博客:http://t.sg.cn/3j5e4z

  7. gulp常用配置

    由于项目中经常会使用到gulp,而每次配置大概都差不多,所以将配置记录一下 项目结构 ├─dist │ ├─assets │ ├─css │ ├─images │ └─js ├─node_module ...

  8. devc++编译时 undefined reference to `__imp_WSAStartup'

    socket编程时遇到的问题:

  9. celery异步发送短信

    1.使用celery异步发送短信 1.1 在 celery_task/mian.py 中添加发送短信函数 # celery项目中的所有导包地址, 都是以CELERY_BASE_DIR为基准设定. # ...

  10. Fist—— 团队展示

    作业要求 软件工程1班 团队名称 Fist 这个作业的目标 团队合作开发项目,加强团队合作,进一步了解相应岗位. 作业正文 https://www.cnblogs.com/team4/p/137730 ...