首页 > 解决方案 > 调整图像大小,然后将其存储在数据库烧瓶中

问题描述

我正在使用这种方式来绘制图像并使用烧瓶将其存储在我的数据库中:

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,但它不适用于我存储图像的方式

谁能帮我减小图像大小?

标签: pythonimageflaskpython-imaging-libraryreduce

解决方案


在我的示例中,上传的图像被缩放并作为二进制数据存储在数据库中。要显示它,可以创建数据的数据 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'
    )

推荐阅读