mirror of
				https://git.sr.ht/~tsileo/microblog.pub
				synced 2025-06-05 21:59:23 +02:00 
			
		
		
		
	Process EXIF orientation for uploaded files
This commit is contained in:
		| @@ -5,6 +5,7 @@ import blurhash  # type: ignore | |||||||
| from fastapi import UploadFile | from fastapi import UploadFile | ||||||
| from loguru import logger | from loguru import logger | ||||||
| from PIL import Image | from PIL import Image | ||||||
|  | from PIL import ImageOps | ||||||
| from sqlalchemy import select | from sqlalchemy import select | ||||||
|  |  | ||||||
| from app import activitypub as ap | from app import activitypub as ap | ||||||
| @@ -46,10 +47,12 @@ async def save_upload(db_session: AsyncSession, f: UploadFile) -> models.Upload: | |||||||
|     height = None |     height = None | ||||||
|  |  | ||||||
|     if f.content_type.startswith("image"): |     if f.content_type.startswith("image"): | ||||||
|         image_blurhash = blurhash.encode(f.file, x_components=4, y_components=3) |         with Image.open(f.file) as _original_image: | ||||||
|         f.file.seek(0) |             # Fix image orientation (as we will remove the info from the EXIF | ||||||
|  |             # metadata) | ||||||
|  |             original_image = ImageOps.exif_transpose(_original_image) | ||||||
|  |  | ||||||
|         with Image.open(f.file) as original_image: |             # Re-creating the image drop the EXIF metadata | ||||||
|             destination_image = Image.new( |             destination_image = Image.new( | ||||||
|                 original_image.mode, |                 original_image.mode, | ||||||
|                 original_image.size, |                 original_image.size, | ||||||
| @@ -57,13 +60,16 @@ async def save_upload(db_session: AsyncSession, f: UploadFile) -> models.Upload: | |||||||
|             destination_image.putdata(original_image.getdata()) |             destination_image.putdata(original_image.getdata()) | ||||||
|             destination_image.save( |             destination_image.save( | ||||||
|                 dest_filename, |                 dest_filename, | ||||||
|                 format=original_image.format, |                 format=_original_image.format, | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|  |             with open(dest_filename, "rb") as dest_f: | ||||||
|  |                 image_blurhash = blurhash.encode(dest_f, x_components=4, y_components=3) | ||||||
|  |  | ||||||
|             try: |             try: | ||||||
|                 width, height = original_image.size |                 width, height = destination_image.size | ||||||
|                 original_image.thumbnail((740, 740)) |                 destination_image.thumbnail((740, 740)) | ||||||
|                 original_image.save( |                 destination_image.save( | ||||||
|                     UPLOAD_DIR / f"{content_hash}_resized", |                     UPLOAD_DIR / f"{content_hash}_resized", | ||||||
|                     format="webp", |                     format="webp", | ||||||
|                 ) |                 ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user