Compress profile image before saving

This commit is contained in:
Peter Stockings
2024-12-25 00:27:09 +11:00
parent cf81057c29
commit 16e31963cc
2 changed files with 20 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
import csv
from io import StringIO
import io
from flask import Blueprint, render_template, redirect, request, send_file, url_for, flash
from werkzeug.security import generate_password_hash, check_password_hash
from app.models import Profile, Reading, db, User
@@ -7,6 +8,7 @@ from app.forms import DeleteForm, LoginForm, ProfileForm, ReadingForm, SignupFor
from flask_login import login_user, login_required, current_user, logout_user
import base64
from datetime import datetime, timedelta
from PIL import Image
main = Blueprint('main', __name__)
auth = Blueprint('auth', __name__)
@@ -206,7 +208,23 @@ def profile():
# Handle profile picture upload
if form.profile_pic.data:
file_data = form.profile_pic.data.read()
profile.profile_pic = base64.b64encode(file_data).decode('utf-8')
# Resize and compress the image
try:
image = Image.open(io.BytesIO(file_data))
image = image.convert("RGB") # Ensure it's in RGB format
image.thumbnail((300, 300)) # Resize to a maximum of 300x300 pixels
# Save the resized image to a buffer
buffer = io.BytesIO()
image.save(buffer, format="JPEG", quality=80) # Compress with quality=80
buffer.seek(0)
# Encode the compressed image as base64
profile.profile_pic = base64.b64encode(buffer.read()).decode('utf-8')
except Exception as e:
flash(f"Error processing profile picture: {e}", 'danger')
db.session.add(profile)
db.session.commit()

View File

@@ -18,6 +18,7 @@ itsdangerous==2.2.0
jinja2==3.1.5
Mako==1.3.8
MarkupSafe==3.0.2
pillow==11.0.0
psycopg2==2.9.10
psycopg2-binary==2.9.10
SQLAlchemy==2.0.36
@@ -25,4 +26,3 @@ typing-extensions==4.12.2
werkzeug==3.1.3
wtforms==3.2.1
zipp==3.21.0
gunicorn==20.1.0