python - 调整图像大小,然后将其存储在数据库烧瓶中
问题描述
我正在使用这种方式来绘制图像并使用烧瓶将其存储在我的数据库中:
class Gallery(db.Model):
__tablename__ = 'Gallery'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128), nullable=False)
name = db.Column(db.String(128), nullable=False)
data = db.Column(db.LargeBinary, nullable=False)
rendered_data = db.Column(db.Text, nullable=False)
def render_picture(data):
render_pic = base64.b64encode(data).decode('ascii')
return render_pic
@app.route('/gallery/create', methods=['POST'])
def create_gallery():
title = request.form['title']
file = request.files['file']
data = file.read()
render_file = render_picture(data)
newFile = Gallery(name=file.filename, data=data, rendered_data=render_file, title=title)
db.session.add(newFile)
db.session.commit()
db.session.close()
它工作正常,但我需要先减小图像大小,然后再将其存储到我的数据库中我以多种方式尝试了 Pillow,但它不适用于我存储图像的方式
谁能帮我减小图像大小?
解决方案
在我的示例中,上传的图像被缩放并作为二进制数据存储在数据库中。要显示它,可以创建数据的数据 url 或将图像的数据下载为文件。
from flask import Flask
from flask import redirect, render_template, request, url_for, send_file
from flask_sqlalchemy import SQLAlchemy
from PIL import Image
import base64
import io
app = Flask(__name__)
db = SQLAlchemy(app)
class Gallery(db.Model):
id = db.Column(db.Integer, primary_key=True)
img_data = db.Column(db.LargeBinary(),
nullable=True, unique=False, index=False)
@property
def b64encoded(self):
return base64.b64encode(self.img_data).decode()
with app.app_context():
db.create_all()
@app.route('/', methods=['GET'])
def index():
galleries = Gallery.query.all()
return render_template('index.html', **locals())
def image_resize(file, size=84):
img = Image.open(file)
img_size = img.size
img_ratio = size/img_size[0]
img.thumbnail((img_size[0]*img_ratio, img_size[1]*img_ratio), Image.ANTIALIAS)
return image_to_bytes(img)
def image_to_bytes(image):
stream = io.BytesIO()
image.save(stream, format='PNG')
return stream.getvalue()
@app.route('/create', methods=['POST'])
def create():
if not 'img' in request.files:
abort(400)
file = request.files['img']
gallery = Gallery()
gallery.img_data = image_resize(file)
db.session.add(gallery)
db.session.commit()
return redirect(url_for('index'))
@app.route('/<int:gallery_id>/image')
def download_image(gallery_id):
gallery = Gallery.query.get_or_404(gallery_id)
if not gallery.img_data:
abort(404)
return send_file(
io.BytesIO(gallery.img_data),
as_attachment=False,
mimetype='image/png'
)
推荐阅读
- javascript - 为什么更新的道具没有反映在 .then 函数中?
- regex - 如何从字符串中提取 x-atmosphere-tracking-id?
- java - 将我的 Google 地图从 FragmentActivity 类型更改为 BottomNavigationView 的简单片段?
- php - 如何使用 Laravel eloquent 查询根据第二个表的字段值的 groupby 从三个表中检索所有数据?
- mysql - 如何?汇总用户选择的数据库设计
- python - CUDA 运行时未知错误,可能是驱动程序问题?CUDA 看不到我的 gpu
- powershell - 需要修剪双扩展名文件的扩展名
- sql - 有没有办法从 xmlvalue.value 方法中选择所有元素而不是指定 [1]
- ios - 将 AdBanner 全局添加到所有屏幕
- sql - 将 varchar 转换为数据类型 numeric (SQL) 的算术溢出错误