You need to enable JavaScript to run this app. Python3.5使用PIL时如何在图片resize前计算输出文件大小
优惠活动
大模型
产品
解决方案
定价
更多

Python3.5使用PIL时如何在图片resize前计算输出文件大小

图片压缩需求与现状说明
  • 开发环境:Python 3.5 + PIL 图像处理库
  • 核心需求:将待传入的图片压缩至最大1MB以内
  • 已完成的基础能力验证:
    • 可通过os.path.getsize(src)直接读取本地文件的实际字节大小,测试用原图testfile.jpg的大小为1531494字节
    • 可通过PIL打开图片后直接读取原始像素尺寸,测试图的尺寸为(1654, 3968)
  • 当前实现的方案与存在的问题:
    • 现有逻辑采用循环试错方案:按不同缩放比例调整图片尺寸,保存文件后再检测实际大小,直到符合目标要求
    • 方案存在明显缺陷:处理1000张不同尺寸图片时耗时极长,且调整步长粗糙,压缩后的图片往往幅度过小,远达不到最优尺寸
  • 待解决的核心问题:
    • 能否在执行resize操作前,计算出输出文件的预估大小
    • 是否存在更高效的实现方案替代现有循环试错逻辑

已有的测试代码片段

读取原文件大小的代码

import os
src = 'testfile.jpg'
os.path.getsize(src)
print(src)

通过PIL读取图片尺寸的代码

from PIL import Image
src = 'testfile.jpg'
image = Image.open(src)
size = image.size
print(size)

现有循环压缩的完整实现代码

def resize_image(src, reduceby=1):
    '''
    按传入的reduceby百分比对图片进行缩放
    '''
    print(" process_image:",src, reduceby)
    org = Image.open(src)
    real_size = org.size
    reduced_size = (int(real_size[0] * reduceby / 100),int(real_size[1] * reduceby / 100) )
    org.resize(reduced_size, Image.ANTIALIAS)
    reduced_file = src[:-4] +"_" + str(reduceby) + src[-4:]
    org.save(reduced_file, optimize=True)
    print(" reduced_image:", reduced_file)
    reduced_filesize = os.path.getsize(reduced_file)
    return reduced_filesize, reduced_file

def loop_image(src, target_size):
    print("loop_image    :", src, target_size)
    file_size = os.path.getsize(src)
    reduced_file =src
    print("source        :", src, file_size)
    reduce_by = 1
    while file_size > target_size:
        file_size, reduced_file = resize_image(src, reduce_by)
        print("target       :", file_size, reduced_file)
        reduce_by += 1
    return reduced_file

注:现有实现存在两处影响效果和效率的明显逻辑漏洞:

  • resize_image中调用org.resize()后未接收返回值,实际保存时仍然使用未缩放的原图
  • loop_image中reduce_by初始值为1、每次循环递增,缩放比例逐渐升高,与“从原图逐步降低尺寸直到符合目标大小”的逻辑完全相反,是导致压缩幅度过大、效率低的直接原因

内容的提问来源于stack exchange,提问作者Papageno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 21:45:07