我正在使用這種方式來拍攝影像并使用燒瓶將其存盤在我的資料庫中:
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()
它作業正常,但我需要在將影像存盤到我的資料庫之前減小影像大小
誰能幫我縮小影像大小?
uj5u.com熱心網友回復:
在我的示例中,上傳的影像被縮放并作為二進制資料存盤在資料庫中。要顯示它,可以創建資料的資料 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'
)
uj5u.com熱心網友回復:
我無法真正理解您的檔案中的內容以及您如何執行它,但只要它有效,就可以了。關于調整影像大小的問題,您使用 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
最后保存上圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332947.html
