Python之如何调整图片的文件大小
作者:XerCis 发布时间:2022-09-27 04:57:50
标签:Python,图片,文件大小
问题描述
Python调整图片文件的占用空间大小,而不是分辨率
1.jpg
图片大小为 8KB
减小文件大小
使用 PIL
模块
pip install Pillow
1. 减小图片质量
代码
import os
from PIL import Image
def compress_under_size(imagefile, targetfile, targetsize):
"""压缩图片尺寸直到某一尺寸
:param imagefile: 原图路径
:param targetfile: 保存图片路径
:param targetsize: 目标大小,单位byte
"""
currentsize = os.path.getsize(imagefile)
for quality in range(99, 0, -1): # 压缩质量递减
if currentsize > targetsize:
image = Image.open(imagefile)
image.save(targetfile, optimize=True, quality=quality)
currentsize = os.path.getsize(targetfile)
if __name__ == '__main__':
imagefile = '1.jpg' # 图片路径
targetfile = 'result.jpg' # 目标图片路径
targetsize = 2 * 1024 # 目标图片大小
compress_under_size(imagefile, targetfile, targetsize) # 将图片压缩到2KB
效果
注意!无法实现图片无限压缩,若文件太小,辨识度也会大大降低
2. 减小图片尺寸
import os
from PIL import Image
def image_compress(filename, savename, targetsize):
"""图像压缩
:param filename: 原图路径
:param savename: 保存图片路径
:param targetsize: 目标大小,单位为byte
"""
image = Image.open(filename)
size = os.path.getsize(filename)
if size <= targetsize:
return
width, height = image.size
num = (targetsize / size) ** 0.5
width, height = round(width * num), round(height * num)
image.resize((width, height)).save(savename)
if __name__ == '__main__':
filename = '1.jpg'
savename = 'result.jpg'
targetsize = 2 * 1024
image_compress(filename, savename, targetsize)
效果
增加文件大小
Windows
通过 subprocess
模块调用系统命令 fsutil file createnew filename filesize
创建指定大小的文件
再用 copy/b
命令合并数据到图片上
import os
import time
import subprocess
imagefile = '1.jpg' # 图片路径
targetfile = 'result.jpg' # 目标图片路径
targetsize = 10 * 1024 * 1024 # 目标图片大小
tempfile = str(int(time.time())) # 临时文件路径
tempsize = str(targetsize - os.path.getsize(imagefile)) # 临时文件大小
subprocess.run(['fsutil', 'file', 'createnew', tempfile, tempsize]) # 创建临时文件
subprocess.run(['copy/b', '{}/b+{}/b'.format(imagefile, tempfile), targetfile], shell=True) # 合并生成新图片
os.remove(tempfile)
Linux
通过 subprocess
模块调用系统命令 fallocate -l filesize filename
创建指定大小的文件
再用 cat >
命令合并数据到图片上
import os
import time
import subprocess
imagefile = '1.jpg' # 图片路径
targetfile = 'result.jpg' # 目标图片路径
targetsize = 10 * 1024 * 1024 # 目标图片大小
tempfile = str(int(time.time())) # 临时文件路径
tempsize = str(targetsize - os.path.getsize(imagefile)) # 临时文件大小
subprocess.run(['fallocate', '-l', tempsize, tempfile]) # 创建临时文件
subprocess.run('cat {} {} > {}'.format(imagefile, tempfile, targetfile), shell=True) # 合并生成新图片
os.remove(tempfile)
效果
图片的分辨率没变
封装
import os
import time
import platform
import subprocess
from PIL import Image
def resize_picture_filesize(imagefile, targetfile, targetsize):
"""调整图片文件大小
:param imagefile: 原图路径
:param targetfile: 保存图片路径
:param targetsize: 目标文件大小,单位byte
"""
currentsize = os.path.getsize(imagefile) # 原图文件大小
if currentsize > targetsize: # 需要缩小
for quality in range(99, 0, -1): # 压缩质量递减
if currentsize > targetsize:
image = Image.open(imagefile)
image.save(targetfile, optimize=True, quality=quality)
currentsize = os.path.getsize(targetfile)
else: # 需要放大
system = platform.system()
tempfile = str(int(time.time())) # 临时文件路径
tempsize = str(targetsize - os.path.getsize(imagefile)) # 临时文件大小
if system == 'Windows':
subprocess.run(['fsutil', 'file', 'createnew', tempfile, tempsize]) # 创建临时文件
subprocess.run(['copy/b', '{}/b+{}/b'.format(imagefile, tempfile), targetfile], shell=True) # 合并生成新图片
elif system == 'Linux':
subprocess.run(['fallocate', '-l', tempsize, tempfile]) # 创建临时文件
subprocess.run('cat {} {} > {}'.format(imagefile, tempfile, targetfile), shell=True) # 合并生成新图片
os.remove(tempfile)
if __name__ == '__main__':
imagefile = '1.jpg' # 8KB的图片
resize_picture_filesize(imagefile, 'reduce.jpg', 2 * 1024) # 缩小到2KB
resize_picture_filesize(imagefile, 'increase.jpg', 800 * 1024) # 放大到800KB
来源:https://blog.csdn.net/lly1122334/article/details/118366401
0
投稿
猜你喜欢
- 本文实例讲述了Python基于最小二乘法实现曲线拟合。分享给大家供大家参考,具体如下:这里不手动实现最小二乘,调用scipy库中实现好的相关
- 为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示:该向量指出了图像 f 在位置(x,y)处
- 之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。 贪婪默认情况
- 序言哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。平常咱们都是直接代码运行,不过今天我们做成软件,这样的话,咱们
- 经常会遇到这样一个情况:浏览器弹出对话框,提示脚本运行时间过长,询问“停止”还是“继续”。那究竟各个浏览器是如何判断在什么时候才弹出此对话框
- 最近 UCDChina 以“注意界面上的文字”为主题写了一系列的文章,使我在界面文字上的使用受益匪浅。之后,我对按钮上的内容的表现也做了一些
- 在while和for循环过程中,为了更加灵活地控制循环的次数,python提供了break和continue循环控制语句。1. break
- SQL Server 2005的新功能为动态管理对象,它们是在指定时间返回某个数据库实例的特殊状态信息的数据库视图或函数。这些对象允许数据库
- 在PyCharm2017中同目录下import其他模块,会出现No model named ...的报错,但实际可以运行这是因为PyChar
- 说实话,对于移除这个旧有功能对于我来说,我是欢心鼓舞的。因为我在开发和应用当中一向不用expression来处理,虽然它确实是非常方便,比如
- Python小白一只,正在成长,程序自己设计,很多不足,算法很多地方能优化。欢迎大佬来指教。游戏效果创建设置类,储存游戏基础数据可以不使用这
- 首先你要确定错误的原因: 让IE显示详细的出错信息: 菜单--工具--Internet选项--高级--显示友好的HTTP错误信息,去掉这个选
- 我就废话不多说了,直接上代码吧!import paramikoimport pymysqlimport timelinux = ['
- 1、需要将时间字符串转换成datetime类型,语法:data[‘time'] = pd.to_datetime(data[‘tim
- 将.ppm格式的图片转换成.jpg格式的图像,除了通过软件转换,还可以使用python脚本直接转换,so easy!!!from PIL i
- python实现的五子棋,能够自动判断输赢,没有是实现电脑对战功能源码下载:pygame五子棋# 1、引入pygame 和 pygame.l
- 今天碰到这个极度郁闷的报错,搞了大半下午,才发现是ie的问题,忍不住大骂。例子是这样的:页面中有多处能出发菜单,并且菜单出现在触发点的旁边,
- 1 Support Vector Machines1.1 Example Dataset 1%matplotlib inlineimport
- 本文实例讲述了python通过apply使用元祖和列表调用函数的方法。分享给大家供大家参考。具体实现方法如下:def my_fuc(a, b
- 正文之前前阵子做了个《人工智能》 的课程作业,然后写了个人工智障。。。大概就是个可以跟你下五子棋的傻儿子。。。下面是代码和效果正文 1、 摘