mirror of
https://github.com/FAUSheppy/homelab_gamevault
synced 2025-12-06 06:51:36 +01:00
feat: automatic image croping to match aspect ratio
This commit is contained in:
@@ -186,7 +186,8 @@ def create_main_window_tile(software):
|
|||||||
|
|
||||||
if software.get_thumbnail():
|
if software.get_thumbnail():
|
||||||
img = PIL.Image.open(software.get_thumbnail())
|
img = PIL.Image.open(software.get_thumbnail())
|
||||||
img = img.resize((200, 300))
|
img = imagetools.smart_resize(img, 200, 300)
|
||||||
|
#img = img.resize((200, 300))
|
||||||
else:
|
else:
|
||||||
img = PIL.Image.new('RGB', (200, 300))
|
img = PIL.Image.new('RGB', (200, 300))
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import PIL
|
import PIL
|
||||||
import tkinter
|
import tkinter
|
||||||
import customtkinter
|
import customtkinter
|
||||||
|
import imagetools
|
||||||
|
|
||||||
|
|
||||||
def show_large_picture(app, path):
|
def show_large_picture(app, path):
|
||||||
@@ -14,7 +15,7 @@ def show_large_picture(app, path):
|
|||||||
y = app.winfo_height()
|
y = app.winfo_height()
|
||||||
|
|
||||||
img = PIL.Image.open(path)
|
img = PIL.Image.open(path)
|
||||||
img = img.resize((x-2*30, y-2*30))
|
img = imagetools.smart_resize(img, x-2*30, y-2*30)
|
||||||
img = PIL.ImageTk.PhotoImage(img)
|
img = PIL.ImageTk.PhotoImage(img)
|
||||||
|
|
||||||
large_image = customtkinter.CTkButton(app, text="", image=img, width=x-2*30, height=y-2*30,
|
large_image = customtkinter.CTkButton(app, text="", image=img, width=x-2*30, height=y-2*30,
|
||||||
@@ -30,7 +31,7 @@ def create_details_page(app, software, backswitch_function):
|
|||||||
if software.get_thumbnail():
|
if software.get_thumbnail():
|
||||||
path = software.get_thumbnail()
|
path = software.get_thumbnail()
|
||||||
img = PIL.Image.open(path)
|
img = PIL.Image.open(path)
|
||||||
img = img.resize((500, 700))
|
img = imagetools.smart_resize(img, 500, 700)
|
||||||
else:
|
else:
|
||||||
img = PIL.Image.new('RGB', (500, 700))
|
img = PIL.Image.new('RGB', (500, 700))
|
||||||
path = None
|
path = None
|
||||||
@@ -136,7 +137,7 @@ def create_details_page(app, software, backswitch_function):
|
|||||||
i = 0
|
i = 0
|
||||||
for path in software.pictures[1:]:
|
for path in software.pictures[1:]:
|
||||||
img = PIL.Image.open(path)
|
img = PIL.Image.open(path)
|
||||||
img = img.resize((180, 180))
|
img = imagetools.smart_resize(img, 180, 180)
|
||||||
img = PIL.ImageTk.PhotoImage(img)
|
img = PIL.ImageTk.PhotoImage(img)
|
||||||
extra_pic_button = customtkinter.CTkButton(picture_frame, text="", image=img, command=lambda path=path: show_large_picture(app, path),
|
extra_pic_button = customtkinter.CTkButton(picture_frame, text="", image=img, command=lambda path=path: show_large_picture(app, path),
|
||||||
hover_color="black", corner_radius=0,)
|
hover_color="black", corner_radius=0,)
|
||||||
|
|||||||
@@ -1,11 +1,20 @@
|
|||||||
import PIL
|
import PIL
|
||||||
|
|
||||||
def load_and_keep_aspect_rescale(path, target_x, target_y):
|
def smart_resize(img, height, width):
|
||||||
'''Load an image and resize it while keeping the aspect ratio (crop if it doesnt fit)'''
|
'''Crop to aspect ratio and then resize'''
|
||||||
|
|
||||||
img = PIL.Image.open(path)
|
current_height, current_width = img.size
|
||||||
# get size
|
target_ratio = height/width
|
||||||
# img.size()
|
current_ratio = current_height/current_width
|
||||||
|
|
||||||
img = img.resize((x-2*30, y-2*30))
|
if current_ratio > target_ratio:
|
||||||
img = PIL.ImageTk.PhotoImage(img)
|
target_crop_height = current_width*target_ratio
|
||||||
|
diff = current_height - target_crop_height
|
||||||
|
img = img.crop((diff/2, 0, current_height-diff/2, current_width))
|
||||||
|
elif current_ratio < target_ratio:
|
||||||
|
target_crop_width = current_height/target_ratio
|
||||||
|
diff = current_width - target_crop_width
|
||||||
|
img = img.crop((0, diff/2, current_height, current_width-diff/2))
|
||||||
|
|
||||||
|
img = img.resize((height, width))
|
||||||
|
return img
|
||||||
Reference in New Issue
Block a user