Files
TeamsLogoAdder/flip_image.py
Chris Sewell b129647230 Initial commit
2025-06-04 17:25:32 -04:00

142 lines
4.8 KiB
Python

import os
import glob
from PIL import Image, ImageDraw
def crop_to_16_9(image):
"""Crop image to 16:9 aspect ratio, centering the crop."""
width, height = image.size
target_ratio = 16 / 9
current_ratio = width / height
if current_ratio > target_ratio:
# Image is too wide, crop width
new_width = int(height * target_ratio)
left = (width - new_width) // 2
right = left + new_width
cropped = image.crop((left, 0, right, height))
else:
# Image is too tall, crop height
new_height = int(width / target_ratio)
top = (height - new_height) // 2
bottom = top + new_height
cropped = image.crop((0, top, width, bottom))
return cropped
def resize_to_target(image, target_width=2560, target_height=1440):
"""Resize image to target dimensions."""
return image.resize((target_width, target_height), Image.Resampling.LANCZOS)
def overlay_logo(image, logo_path):
"""Overlay logo on the upper-right corner of the image."""
if not os.path.exists(logo_path):
print(f"Warning: Logo file {logo_path} not found. Skipping logo overlay.")
return image
try:
logo = Image.open(logo_path).convert("RGBA")
# Resize logo to be exactly 480 pixels tall while maintaining aspect ratio
logo_height = 480
logo_ratio = logo.size[0] / logo.size[1] # width / height
logo_width = int(logo_height * logo_ratio)
logo = logo.resize((logo_width, logo_height), Image.Resampling.LANCZOS)
# Get image dimensions
img_width, img_height = image.size
# Position logo in exact upper-right corner with no padding
x = img_width - logo_width
y = 0
# Create a copy of the image to work with
result = image.copy().convert("RGBA")
# Paste logo with transparency
result.paste(logo, (x, y), logo)
# Convert back to RGB
return result.convert("RGB")
except Exception as e:
print(f"Error overlaying logo: {e}")
return image
def process_images():
"""Process all .jpg and .png images in the input folder."""
input_folder = "input"
output_folder = "output"
logo_folder = "logo"
# Create output folder if it doesn't exist
os.makedirs(output_folder, exist_ok=True)
# Find logo file in logo directory
logo_files = glob.glob(os.path.join(logo_folder, "*.png"))
if not logo_files:
# Fallback to cornerlogo.png in root directory
if os.path.exists("cornerlogo.png"):
logo_path = "cornerlogo.png"
print("Using cornerlogo.png from root directory")
else:
logo_path = None
print("Warning: No logo file found")
else:
logo_path = logo_files[0] # Use first PNG found in logo directory
print(f"Using logo: {logo_path}")
# Find all image files in input folder
image_extensions = ["*.jpg", "*.jpeg", "*.png", "*.JPG", "*.JPEG", "*.PNG"]
image_files = []
for extension in image_extensions:
image_files.extend(glob.glob(os.path.join(input_folder, extension)))
if not image_files:
print(f"No image files found in {input_folder} folder.")
return
print(f"Found {len(image_files)} image(s) to process:")
for image_path in image_files:
try:
print(f"Processing: {os.path.basename(image_path)}")
# Open and process the image
with Image.open(image_path) as img:
# Convert to RGB if necessary
if img.mode != 'RGB':
img = img.convert('RGB')
# Step 1: Crop to 16:9 aspect ratio
cropped_img = crop_to_16_9(img)
# Step 2: Resize to 2560x1440
resized_img = resize_to_target(cropped_img)
# Step 3: Overlay logo
if logo_path:
logo_img = overlay_logo(resized_img, logo_path)
else:
logo_img = resized_img
# Step 4: Save as JPG in output folder
base_name = os.path.splitext(os.path.basename(image_path))[0]
output_path = os.path.join(output_folder, f"{base_name}_logo.jpg")
logo_img.save(output_path, "JPEG", quality=95)
print(f"Saved: {output_path}")
except Exception as e:
print(f"Error processing {image_path}: {e}")
def main():
"""Main function to process images."""
print("TeamsFlipper - Image Processing Tool")
print("=" * 40)
process_images()
print("Processing complete!")
if __name__ == '__main__':
main()