from fastapi import FastAPI, File, UploadFile, Form from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from PIL import Image import requests from io import BytesIO import base64 import os from tkinter import Tk, Label, Button, Radiobutton, IntVar app = FastAPI() # Mount static folder app.mount("/static", StaticFiles(directory="static"), name="static") # Function to crop to desired dimensions while keeping ratio from PIL import Image def cropper(img: Image.Image, target_width: int, target_height: int) -> Image.Image: # Clamp target dimensions to a maximum of 1600px target_width = min(target_width, 1600) target_height = min(target_height, 1600) # Original size orig_w, orig_h = img.size target_ratio = target_width / target_height orig_ratio = orig_w / orig_h # Scale image to cover target box if orig_ratio > target_ratio: # Image is wider than target → scale by height new_h = target_height new_w = int(orig_w * (target_height / orig_h)) else: # Image is taller/narrower → scale by width new_w = target_width new_h = int(orig_h * (target_width / orig_w)) img_resized = img.resize((new_w, new_h), Image.LANCZOS) # Crop center left = max((new_w - target_width) // 2, 0) top = max((new_h - target_height) // 2, 0) right = left + target_width bottom = top + target_height return img_resized.crop((left, top, right, bottom)) # Home Page @app.get("/", response_class=HTMLResponse) def home_page(): return """ Part of Idoia's Developer Portfolio - Innovating the Web

Recsize Image App

Please select an option below:

Image credit Adobe Stock User Umami Lab and Shutterstock User PhoArt101.
""" # Demo Page @app.get("/demo", response_class=HTMLResponse) def demo_page(): # URLs for demo images url1 = "https://raw.githubusercontent.com/webdevserv/images_video/main/squareportrait.png" url2 = "https://raw.githubusercontent.com/webdevserv/images_video/main/squarelandscape.png" # Process the first image response = requests.get(url1) img1 = Image.open(BytesIO(response.content)).convert("RGB") rectangled_img1 = cropper(img1,200,200) output1 = BytesIO() rectangled_img1.save(output1, format="JPEG") encoded_img1 = base64.b64encode(output1.getvalue()).decode("utf-8") # Process the second image response = requests.get(url2) img2 = Image.open(BytesIO(response.content)).convert("RGB") rectangled_img2 = cropper(img2,300,300) output2 = BytesIO() rectangled_img2.save(output2, format="JPEG") encoded_img2 = base64.b64encode(output2.getvalue()).decode("utf-8") return f""" Part of Idoia's Developer Portfolio - Innovating the Web

Recsize Image Demo (CPU Optimized)

Image will be resized as per your input pixel numbers.

Result 1:

Result 2:

Back

Image credit Adobe Stock User Umami Lab and Shutterstock User PhoArt101.
""" @app.get("/application", response_class=HTMLResponse) def application_page(): return """ Part of Idoia's Developer Portfolio - Innovating the Web

Resize Image Application (CPU Optimized)

Upload a JPG image and choose your target dimensions. Max 1600px per side.







Back
Image credit Adobe Stock User Umami Lab and Shutterstock User PhoArt101.
""" @app.post("/upload/") async def upload_file( file: UploadFile = File(...), target_width: int = Form(...), target_height: int = Form(...) ): try: # Await file upload contents = await file.read() img = Image.open(BytesIO(contents)).convert("RGB") # Crop to the user’s chosen dimensions (cropper clamps to max 1024px) cropped_img = cropper(img, target_width, target_height) # Save the cropped image (original size) output = BytesIO() cropped_img.save(output, format="JPEG") output.seek(0) # Encode the full-size image for download full_size_encoded_img = base64.b64encode(output.getvalue()).decode("utf-8") # Resize the image for display (512px wide, keep aspect ratio) display_img = cropped_img.copy() desired_width = 512 aspect_ratio = display_img.height / display_img.width desired_height = int(desired_width * aspect_ratio) display_img.thumbnail((desired_width, desired_height)) display_output = BytesIO() display_img.save(display_output, format="JPEG") display_output.seek(0) # Encode the resized display image display_encoded_img = base64.b64encode(display_output.getvalue()).decode("utf-8") # Return the HTML response return HTMLResponse( content=f""" Part of Idoia's Developer Portfolio - Innovating the Web

Image successfully cropped!

Download Full-Size Image

Back

""", media_type="text/html" ) except Exception as e: return HTMLResponse(content=f"

An error occurred: {e}

", media_type="text/html") if __name__ == "__main__": import uvicorn, os uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))