3v324v23's picture
Update Comic123 with local comic folder files
83e35a7
import os
from os import listdir
from backend.panel_layout.cam import get_coordinates, dump_CAM_data
from backend.utils import crop_image
from backend.panel_layout.layout.page import get_templates,panel_create
from backend.utils import get_panel_type, types
from PIL import Image
def smart_resize(index, panel_type, img_w, img_h):
"""
Smart resize without cropping - maintains full image visibility and quality
"""
frame_path = os.path.join("frames",'final',f"frame{index+1:03d}.png")
wP, hP = types[panel_type]['width'], types[panel_type]['height']
# Calculate scaling to fit image within panel while maintaining aspect ratio
scale_w = wP / img_w
scale_h = hP / img_h
scale = min(scale_w, scale_h) # Use smaller scale to fit entire image
# Calculate new dimensions
new_width = int(img_w * scale)
new_height = int(img_h * scale)
# Calculate centering offsets
offset_x = (wP - new_width) / 2
offset_y = (hP - new_height) / 2
# Resize image with maximum quality settings
img = Image.open(frame_path)
# Use high-quality resampling for better image quality
resized_img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
# Save with maximum quality settings
resized_img.save(frame_path, quality=95, optimize=True)
# Return coordinates for bubble positioning (full image area)
return (offset_x, offset_x + new_width, offset_y, offset_y + new_height)
def generate_layout():
"""
Redesigned layout generation - no cropping, smart resizing, proper bubble alignment
"""
# Get dimensions of images
img = Image.open(os.path.join("frames",'final',f"frame001.png"))
width, height = img.size
# For high-accuracy mode, use simple panel type assignment
HIGH_ACCURACY = os.getenv('HIGH_ACCURACY', '0')
if HIGH_ACCURACY in ('1', 'true', 'True', 'YES', 'yes'):
# Use panel type 6 (2x2) for all images in high-accuracy mode
input_seq = ""
folder_dir = "frames/final"
for image in os.listdir(folder_dir):
input_seq += "6" # Always use panel type 6 for 2x2 grid
else:
# Original logic for non-high-accuracy mode
input_seq = ""
cam_coords = []
folder_dir = "frames/final"
for image in os.listdir(folder_dir):
frame_path = os.path.join("frames",'final',image)
left, right, top, bottom = get_coordinates(frame_path)
input_seq += get_panel_type(left, right, top, bottom)
cam_coords.append((left, right, top, bottom))
page_templates = get_templates(input_seq)
print(f"Page templates: {page_templates}")
i = 0
image_coords = []
try:
for page in page_templates:
for panel in page:
# Use smart resize instead of cropping
coords = smart_resize(i, panel, width, height)
image_coords.append(coords)
i += 1
except(IndexError):
pass
panels = panel_create(page_templates)
# For high-accuracy mode, skip CAM data (not needed for smart resize)
if HIGH_ACCURACY not in ('1', 'true', 'True', 'YES', 'yes'):
dump_CAM_data()
return image_coords, page_templates, panels