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


猜你喜欢
- 这篇文章主要介绍了Python Django 封装分页成通用的模块详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 第一款在线格式化工具:Instant SQL Formatter功能强劲,可以设置第二款,和第一款类似,功能也一样,只不过是不同的UI而已,
- 说明:通过随机产生密码,然后将密码EMail给注册用户,你可以确认用户的EMail填写是否正确。自动产生的密码往往安全性更高,同时,你可以过
- 1、MySQL 5.6.32 64位安装包下载在官网http://dev.mysql.com/downloads/mysql/5.6.htm
- base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信
- 网页布局中常有的一种情况就是网页主体部分分成一行两列;而在很多种情况下,设计师们常把左右两列的背景色设计成不同色彩,以实现内容块的明显区分;
- 1.哆啦A梦“只要把愿望系在竹竿上请求月亮女神,心愿便能达成”。我超喜欢这句话。哆啦A梦的创造要追溯
- 做查询页面,查询条件比较多的时候往往会涉及到级联。举个简单的例子,拿教务系统来说,我们要查询教学计划信息,查询条件是入学批次、学生层次(专升
- Go语言最主要的特性自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性高性能/高效开发安装安装说
- 众所周知,Mac自带python2,但无奈我们想使用新版本,因此我们需要安装python3安装python3我使用了homebrew,网上也
- 前言临近期末做了一个商品销售管理系统,分享下,全部源码在码云,需要自取,博客只分享部分代码(太多了)。数据库的建立我们使用Navicat P
- Python中sorted()用法sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、
- Pygame是一组跨平台的 Python 模块,专为编写视频游戏而设计。它包括旨在与 Python 编程语言一起使用的计算机图形和声音库。您
- 问题描述:1、(先添加时间戳,再复制移动,两个文件加下面的文件名都被修改)将 /home/kangle/webdata/JPEGImages
- 升级背景:为了解决mysql低版本的漏洞,从mysql5.5升级到了8.0.11版本,再次升级到了8.0.17版本(从版本是2019.7.2
- Dreamweaver 2004 除了可以插入 Flash SWF 動畫、Flash 文字和 Flash 按鈕以外,這次又新增加了一個叫做
- 1、基本语法和说明在 Go 语言 中,跳转控制语句除了有 goto 、break 和&nb
- 需求:查询表dbo.Message,每页10条,查询第2页1:TOP()SELECT TOP(20) * FROM dbo.Message
- 本文实例讲述了mysql简单实现查询结果添加序列号的方法。分享给大家供大家参考,具体如下:第一种方法:select (@i:=@i+1) a
- 前言:1、上几次讨论右键禁止等问题的时候,有网友问那里有键值表KeyCode,我今天写了一个javascript,以飨各位有需要者。2、适用