给 AI 上传图片前怎么压缩?用 Pillow 控制尺寸、JPEG 体积并保留原图

用 Pillow 创建上传副本,处理EXIF方向与透明背景,限制最长边、对比JPEG质量参数并回读尺寸体积,保留原图与内容核对边界。

给 AI 图片接口上传前,可以保存一个体积较小的副本,控制最长边和 JPEG 编码参数,同时保留原图供回查。Pillow 的 thumbnail 保持宽高比例;JPEG 的 quality 调整体积与细节。透明 PNG 转 JPEG 时,需要先明确背景颜色,避免丢掉透明层后的显示结果不可控。

先确认接收端要求,再选压缩方案

核对实际接口允许的格式、字节限制和像素限制。本文不针对某个产品承诺固定上传上限,也不估算 token 费用。照片或连续色彩图可以考虑 JPEG;需要透明度或细小文字的图,应比较 PNG 与其他允许格式,不必强行改成 JPEG。

给 AI 上传图片前怎么压缩?用 Pillow 控制尺寸、JPEG 体积并保留原图

最长边、编码质量和图片内容都会影响体积,quality 数值不等于统一的视觉质量百分比。这个示例把副本限制在800×800内,生成85和60两档供对比,保留两个输出的实际字节数;真实图片不保证有相同压缩比例。

环境与完整代码

示例在 Windows、Python 3.11.15 的本地 CPU 环境实际运行。新建空文件夹,将后面完整代码保存为 10-image-upload-compress.py,在该目录用 PowerShell 执行:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install Pillow==11.3.0 numpy==2.4.6
.\.venv\Scripts\python.exe 10-image-upload-compress.py

最后一行在保存代码后执行。macOS 或 Linux 使用 ./.venv/bin/python。输出文件留在当前目录,先用教学样本核对;代码不调用大模型 API,也不修改你的原始业务文件。

代码生成一张1440×960的人工纹理PNG,左侧半透明。它只演示读取、方向处理、背景合成、缩放与JPEG编码,不是 AI 生成结果或客户素材。换真实图片时移除示例生成段,直接指向已有原文件并保存输出副本。

把完整代码保存为 10-image-upload-compress.py 后运行,打开 upload_q85.jpg、upload_q60.jpg 与 compression_audit.json;对照尺寸和字节数,再检查真实图片的文字、面部与细节是否满足任务。

from pathlib import Path
import hashlib,json
import numpy as np
from PIL import Image,ImageOps

# 人工随机纹理图,左侧半透明;不是照片质量或OCR测试材料。
rng=np.random.default_rng(42)
pixels=np.empty((960,1440,4),dtype=np.uint8)
pixels[:,:,:3]=rng.integers(0,256,(960,1440,3),dtype=np.uint8)
pixels[:,:,3]=255;pixels[:,:360,3]=80
source=Path('upload_source.png')
Image.fromarray(pixels).save(source)
digest=hashlib.sha256(source.read_bytes()).hexdigest()
with Image.open(source) as src:
    rgba=ImageOps.exif_transpose(src).convert('RGBA')
    canvas=Image.new('RGB',rgba.size,'white')
    canvas.paste(rgba,mask=rgba.getchannel('A'))  # JPEG没有透明通道。
    canvas.thumbnail((800,800),Image.Resampling.LANCZOS)
    records=[]
    for quality in (85,60):
        path=Path(f'upload_q{quality}.jpg')
        canvas.save(path,format='JPEG',quality=quality,optimize=True)
        with Image.open(path) as out:
            out.load()
            assert out.mode=='RGB' and max(out.size)<=800
            row={'file':path.name,'quality':quality,'size':list(out.size),'bytes':path.stat().st_size}
            records.append(row)
            print(json.dumps(row))
print('source bytes:',source.stat().st_size)
assert digest==hashlib.sha256(source.read_bytes()).hexdigest()
print('original unchanged: True')
Path('compression_audit.json').write_text(json.dumps({'source_sha256':digest,'outputs':records},indent=2),encoding='utf-8')

实际尺寸、字节数和原图保护

{"file": "upload_q85.jpg", "quality": 85, "size": [800, 533], "bytes": 199944}
{"file": "upload_q60.jpg", "quality": 60, "size": [800, 533], "bytes": 96404}
source bytes: 4728986
original unchanged: True

本地教学输入为1440×960,两个JPEG副本均为800×533;quality=85 的文件约199944字节,quality=60 约96404字节,源PNG约4728986字节,original unchanged 为 True。

透明像素先与白色背景合成,再转换成RGB JPEG。JPEG不保留透明通道;背景颜色属于输出政策,浅色内容换成白底可能难看清。需要透明度时保留支持透明的输出格式,而不是把背景变化当成压缩完成。

thumbnail 会修改当前图像对象,所以代码只处理副本 canvas,不对原文件保存。输出回读检查最大边和RGB模式,源文件哈希在前后保持一致。这里应用 EXIF 方向,避免宽高计算与最终显示方向不一致;带标注的数据还需同步核对坐标。

怎样决定用哪个副本上传

本例输入是人工随机纹理,并非照片、截图或OCR评测材料。文件更小不能证明 AI 识别效果保持不变;文字、表格、细线和面部细节需要针对真实任务复核。

先满足字节与像素限制,再按实际用途核对:文档图片检查字符和表格边界,商品图片检查颜色与细节,人脸或细粒度分类检查关键区域。用同一测试输入在接收程序实际运行,并记录输出变化;不能用体积下降百分比代替识别测试。

optimize=True 用于JPEG编码的优化步骤,不等于AI增强,也不保证任意PNG转换后一定更小。PNG可能已经很适合某些简单图案;如果转换后反而变大,应保留较适合该内容的格式或调整最大边,而不是无条件覆盖。

本例没有保留全部EXIF、ICC色彩配置或多帧内容。照片色彩管理、多页TIFF、动画GIF等场景需要各自的读取保存政策。超大图片应先检查资源与解码限制,按明确的异常处理保留输入,不把失败文件算作已压缩成功。

官方资料与核对范围

资料读取日期为 2026 年 10 月 1 日。接口行为依照以下官方文档或项目说明核对,输出来自上述本地教学代码。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31831.html

赞 (0)
AI小管家的头像AI小管家
AI 音频格式怎么转换?用 SoundFile 在 WAV 与 FLAC 间转换并回读
上一篇 2小时前
Gemini Notebook 思维导图怎么生成?展开主题、追问节点并下载
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部