一、思路分析

其实,照片处理要求很简单,主要是两个方面:一个是调整图片尺寸(即宽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. 对于MySQL数据库四种隔离等级

    对于MySQL事务有四种隔离级别,分别是以下四种: 1.读未提交 2.读提交 3.可重复读 4.串行化(加锁) 对于隔离我们都是说在并发的情况下发生的事情,读取的数据在并发的情况下会发生什么情况. 并 ...

  2. Linux三剑客grep、awk、sed

    何为Linux三剑客? 第一个剑客是 grep,grep 会根据正则表达式查找相关内容并打印对应的数据. 第二个剑客是 awk,awk 的名字来源于三个作者的名字简称,它可以根据定位到的数据行处理其中 ...

  3. C语言中connst用法

    1.const一般用来定义只读变量,这个变量的之只能在初始化时赋值,如果初始化时没有赋值,则默认为0.如果在其他地方试图更改此值,编译会报错.如: 1 #include<stdio.h> ...

  4. 第一次UML编程作业

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  5. Bootstrap Blazor 组件介绍 Table (三)列数据格式功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  6. lcm的和(莫比乌斯反演)

    马上开学了,加一个操作系统和数据库标签 不玩了,求1-n和1-m的lcm(i,j)和 首先想到把lcm(i,j)转化为i * j / gcd(i, j) 然后gcd,要素察觉,开始枚举d使得gcd(i ...

  7. moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了剪辑相关类及关系,其中VideoClip有多个直接子类和间接子类 ...

  8. PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

  9. 第15.22节 PyQt(Python+Qt)入门学习:Model/View架构详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.简介 在PyQt和Qt中,Model/View架构是图形界面开发时用于管理数据和界面展现方式的关 ...

  10. [BJDCTF2020]Cookie is so stable && [GWCTF 2019]枯燥的抽奖

    [BJDCTF2020]Cookie is so stable 进入环境后看到有hint,点击之后查看源代码 提示我们cookie有线索 flag页面是: 需要输入一个username,或许这道题目是 ...