Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from fastapi import FastAPI, File,
|
| 2 |
from fastapi.responses import HTMLResponse
|
| 3 |
from fastapi.staticfiles import StaticFiles
|
| 4 |
import numpy as np
|
|
@@ -7,14 +7,49 @@ from io import BytesIO
|
|
| 7 |
import requests
|
| 8 |
import base64
|
| 9 |
import os
|
|
|
|
| 10 |
|
| 11 |
app = FastAPI()
|
| 12 |
|
| 13 |
# Mount the static folder for CSS and other assets
|
| 14 |
app.mount("/static", StaticFiles(directory="static"), name="static")
|
| 15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
# Function for cropping and filling the image
|
| 17 |
-
def
|
| 18 |
imgsz = [img.height, img.width]
|
| 19 |
avg_color_per_row = np.average(img, axis=0)
|
| 20 |
avg_color = np.average(avg_color_per_row, axis=0)
|
|
@@ -42,7 +77,16 @@ def fill_rectangle_cropper(img):
|
|
| 42 |
return newimg
|
| 43 |
else:
|
| 44 |
return img
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
# Home Page
|
| 47 |
@app.get("/", response_class=HTMLResponse)
|
| 48 |
def home_page():
|
|
@@ -111,7 +155,7 @@ def demo_page():
|
|
| 111 |
# Process the first image
|
| 112 |
response = requests.get(url1)
|
| 113 |
img1 = Image.open(BytesIO(response.content)).convert("RGB")
|
| 114 |
-
rectangled_img1 = fill_rectangle_cropper(img1)
|
| 115 |
output1 = BytesIO()
|
| 116 |
rectangled_img1.save(output1, format="JPEG")
|
| 117 |
encoded_img1 = base64.b64encode(output1.getvalue()).decode("utf-8")
|
|
@@ -119,7 +163,7 @@ def demo_page():
|
|
| 119 |
# Process the second image
|
| 120 |
response = requests.get(url2)
|
| 121 |
img2 = Image.open(BytesIO(response.content)).convert("RGB")
|
| 122 |
-
rectangled_img2 =
|
| 123 |
output2 = BytesIO()
|
| 124 |
rectangled_img2.save(output2, format="JPEG")
|
| 125 |
encoded_img2 = base64.b64encode(output2.getvalue()).decode("utf-8")
|
|
@@ -157,8 +201,16 @@ def application_page():
|
|
| 157 |
<h2>Rectangle Image Application</h2>
|
| 158 |
<p>Upload a JPG image to rectangle and fill with color filler.</p>
|
| 159 |
<form action="/upload/" enctype="multipart/form-data" method="post">
|
| 160 |
-
|
| 161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
</form>
|
| 163 |
<a href="/">Back</a>
|
| 164 |
</body>
|
|
|
|
| 1 |
+
from fastapi import FastAPI, File, UploadFilek, Form
|
| 2 |
from fastapi.responses import HTMLResponse
|
| 3 |
from fastapi.staticfiles import StaticFiles
|
| 4 |
import numpy as np
|
|
|
|
| 7 |
import requests
|
| 8 |
import base64
|
| 9 |
import os
|
| 10 |
+
from tkinter import Tk, Label, Button, Radiobutton, IntVar
|
| 11 |
|
| 12 |
app = FastAPI()
|
| 13 |
|
| 14 |
# Mount the static folder for CSS and other assets
|
| 15 |
app.mount("/static", StaticFiles(directory="static"), name="static")
|
| 16 |
|
| 17 |
+
# Function to add padding
|
| 18 |
+
def fill_rectangle_cropper(img, padding_type):
|
| 19 |
+
# Calculate the average color of the image
|
| 20 |
+
avg_color_per_row = np.average(img, axis=0)
|
| 21 |
+
avg_color = np.average(avg_color_per_row, axis=0)
|
| 22 |
+
|
| 23 |
+
if padding_type == "top_bottom":
|
| 24 |
+
if img.width > img.height:
|
| 25 |
+
new_height = img.width
|
| 26 |
+
newimg = Image.new(
|
| 27 |
+
'RGB',
|
| 28 |
+
(img.width, new_height),
|
| 29 |
+
(round(avg_color[0]), round(avg_color[1]), round(avg_color[2]))
|
| 30 |
+
)
|
| 31 |
+
padding_top = (new_height - img.height) // 2
|
| 32 |
+
newimg.paste(img, (0, padding_top))
|
| 33 |
+
return newimg
|
| 34 |
+
else:
|
| 35 |
+
return img # No change for already square images
|
| 36 |
+
|
| 37 |
+
elif padding_type == "left_right":
|
| 38 |
+
if img.height > img.width:
|
| 39 |
+
new_width = img.height
|
| 40 |
+
newimg = Image.new(
|
| 41 |
+
'RGB',
|
| 42 |
+
(new_width, img.height),
|
| 43 |
+
(round(avg_color[0]), round(avg_color[1]), round(avg_color[2]))
|
| 44 |
+
)
|
| 45 |
+
padding_left = (new_width - img.width) // 2
|
| 46 |
+
newimg.paste(img, (padding_left, 0))
|
| 47 |
+
return newimg
|
| 48 |
+
else:
|
| 49 |
+
return img # No change for already square images
|
| 50 |
+
|
| 51 |
# Function for cropping and filling the image
|
| 52 |
+
def fill_rectangle_cropper1(img,padding):
|
| 53 |
imgsz = [img.height, img.width]
|
| 54 |
avg_color_per_row = np.average(img, axis=0)
|
| 55 |
avg_color = np.average(avg_color_per_row, axis=0)
|
|
|
|
| 77 |
return newimg
|
| 78 |
else:
|
| 79 |
return img
|
| 80 |
+
|
| 81 |
+
def on_submit():
|
| 82 |
+
padding_choice = padding_option.get()
|
| 83 |
+
if padding_choice == 1:
|
| 84 |
+
result_img = fill_rectangle_cropper(img, "top_bottom")
|
| 85 |
+
elif padding_choice == 2:
|
| 86 |
+
result_img = fill_rectangle_cropper(img, "left_right")
|
| 87 |
+
# Here you can save or display result_img
|
| 88 |
+
print("Padding applied based on selection!")
|
| 89 |
+
|
| 90 |
# Home Page
|
| 91 |
@app.get("/", response_class=HTMLResponse)
|
| 92 |
def home_page():
|
|
|
|
| 155 |
# Process the first image
|
| 156 |
response = requests.get(url1)
|
| 157 |
img1 = Image.open(BytesIO(response.content)).convert("RGB")
|
| 158 |
+
rectangled_img1 = fill_rectangle_cropper(img1, "top_bottom")
|
| 159 |
output1 = BytesIO()
|
| 160 |
rectangled_img1.save(output1, format="JPEG")
|
| 161 |
encoded_img1 = base64.b64encode(output1.getvalue()).decode("utf-8")
|
|
|
|
| 163 |
# Process the second image
|
| 164 |
response = requests.get(url2)
|
| 165 |
img2 = Image.open(BytesIO(response.content)).convert("RGB")
|
| 166 |
+
rectangled_img2 = fill_rectangle_cropper(img2, "left_right")
|
| 167 |
output2 = BytesIO()
|
| 168 |
rectangled_img2.save(output2, format="JPEG")
|
| 169 |
encoded_img2 = base64.b64encode(output2.getvalue()).decode("utf-8")
|
|
|
|
| 201 |
<h2>Rectangle Image Application</h2>
|
| 202 |
<p>Upload a JPG image to rectangle and fill with color filler.</p>
|
| 203 |
<form action="/upload/" enctype="multipart/form-data" method="post">
|
| 204 |
+
<label for="file">Upload your image:</label>
|
| 205 |
+
<input name="file" type="file" required><br><br>
|
| 206 |
+
|
| 207 |
+
<label>Choose the padding direction:</label><br>
|
| 208 |
+
<input type="radio" id="top_bottom" name="padding_type" value="top_bottom" checked>
|
| 209 |
+
<label for="top_bottom">Top/Bottom</label><br>
|
| 210 |
+
<input type="radio" id="left_right" name="padding_type" value="left_right">
|
| 211 |
+
<label for="left_right">Left/Right</label><br><br>
|
| 212 |
+
|
| 213 |
+
<input type="submit" value="Rectangle It">
|
| 214 |
</form>
|
| 215 |
<a href="/">Back</a>
|
| 216 |
</body>
|