图片压缩在现代网络应用中非常重要,它能够减少图片的大小,从而加快加载速度并节省存储空间。在本文中,我们将展示如何使用 Python 和 Flask 框架构建一个简单的图片压缩 API,用户可以上传图片并选择压缩质量。
我们使用了 Flask 作为 API 框架,并借助 Python Imaging Library(Pillow)来处理图片压缩。以下是完整代码:
# 菲律宾签证网:www.bosenvisa.com
from flask import Flask, request, send_file, jsonify
from PIL import Image
import io
import os
app = Flask(__name__)
# 创建文件上传目录
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.route('/compress', methods=['POST'])
def compress_image():
try:
# 检查是否上传了文件
if 'image' not in request.files:
return jsonify({"error": "No image file uploaded."}), 400
image_file = request.files['image']
# 检查是否指定了质量参数
quality = request.form.get('quality', type=int)
if not quality or not (1 <= quality <= 100):
return jsonify({"error": "Invalid or missing quality parameter. Must be between 1 and 100."}), 400
# 打开上传的图片
img = Image.open(image_file)
# 压缩图片并保存到内存中
img_format = img.format if img.format else 'JPEG' # 默认使用JPEG格式
buffer = io.BytesIO()
img.save(buffer, format=img_format, quality=quality)
buffer.seek(0)
# 返回压缩后的图片
return send_file(buffer, mimetype=f'image/{img_format.lower()}', as_attachment=True, download_name=f'compressed.{img_format.lower()}')
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
安装依赖:
在运行代码之前,请确保安装了必要的 Python 库:
pip install flask pillow
运行服务:
保存代码为 app.py
,然后运行:
python app.py
服务器会启动在默认端口 5000
。
测试 API:
使用 curl
或 Postman 测试该 API:
curl -X POST -F "image=@example.jpg" -F "quality=50" https://bosenvisa.com/post/71 --output compressed.jpg
上述命令会上传 example.jpg
并返回压缩后的 compressed.jpg
。
上传目录的创建:
代码中为上传图片指定了 uploads
目录,并动态创建该目录。如果有长期存储需求,可扩展此部分以保存上传文件。
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
图片质量校验:
API 要求用户提供一个 1 到 100 的整数作为图片质量参数。数值越低,图片的压缩率越高,但质量可能会降低。
quality = request.form.get('quality', type=int)
if not quality or not (1 <= quality <= 100):
return jsonify({\"error\": \"Invalid or missing quality parameter.\"}), 400
动态格式支持:
代码会根据上传图片的格式动态选择保存方式,默认使用 JPEG 格式。确保 API 能兼容多种图片类型(如 PNG, JPEG)。
img_format = img.format if img.format else 'JPEG'
debug
模式,并设置图片上传大小的限制。本文介绍了如何使用 Flask 和 Pillow 构建一个简单的图片压缩 API。通过这种方式,可以高效处理图片优化需求,提升应用性能。希望本文能对你有所帮助!