调整图像大小,然后将其存储在数据库中

2024-04-26 04:44:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用这种方式拍摄图像,并使用flask将其存储在我的数据库中:

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()

它工作正常,但我需要在将图像存储到数据库之前减小图像大小 我尝试了很多种枕头,但它不符合我存储图像的方式

有人能帮我缩小图像尺寸吗


Tags: name图像数据库falsedbdatastringtitle
2条回答

我真的不明白你的文件里有什么,你是如何执行的,但只要它能工作,就可以了。关于调整图像大小的问题,使用PIL(Python图像库)是正确的。我不熟悉base64和io,我认为您根本不需要它们。我调整图像大小的方法是:

您可以创建一个函数来执行以下操作:

def save_picture(form_picture):
    random_hex = secrets.token_hex(8)

我使用的Python秘密可以作为

 import secrets

这可以用来为图像生成一个随机名称,所以我们没有很多同名的图像,我已经将其指定为8位,如上所示form_picture是此处的一个参数:

_,f_ext = os.path.splitext(form_picture.filename)
picture_fn = random_hex + f_ext
picture_path = os.path.join(app.root_path, 'static/profile_pics', 
picture_fn)  
output_size = (125, 125)
i = Image.open(form_picture)

这将定义图片的路径,将"static/profile_pics"picture_fn变量连接起来,后者是定义图片实际名称的变量名称output_size函数指定图片为125像素

i.thumbnail(output_size)
i.save(picture_path)
return picture_fn

并在最后保存上述图片

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

相关问题 更多 >