You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.4 KiB
123 lines
4.4 KiB
#!/usr/bin/env python3 |
|
""" |
|
Script to resize PNG asset files to 18x18 pixels and center them on a 20x20 canvas. |
|
Saves the result back to the same file. |
|
""" |
|
|
|
import os |
|
import glob |
|
from PIL import Image, ImageOps |
|
import argparse |
|
|
|
def resize_and_center_image(image_path, target_size=(18, 18), canvas_size=(20, 20)): |
|
""" |
|
Resize an image to target_size and center it on a canvas of canvas_size. |
|
|
|
Args: |
|
image_path (str): Path to the image file |
|
target_size (tuple): Size to resize the image to (width, height) |
|
canvas_size (tuple): Size of the final canvas (width, height) |
|
""" |
|
try: |
|
# Open the image |
|
with Image.open(image_path) as img: |
|
# Convert to RGBA to handle transparency |
|
img = img.convert("RGBA") |
|
|
|
# Resize the image to target size using high-quality resampling |
|
resized_img = img.resize(target_size, Image.Resampling.LANCZOS) |
|
|
|
# Create a new transparent canvas |
|
canvas = Image.new("RGBA", canvas_size, (0, 0, 0, 0)) |
|
|
|
# Calculate position to center the resized image |
|
x_offset = (canvas_size[0] - target_size[0]) // 2 |
|
y_offset = (canvas_size[1] - target_size[1]) // 2 |
|
|
|
# Paste the resized image onto the canvas |
|
canvas.paste(resized_img, (x_offset, y_offset), resized_img) |
|
|
|
# Save back to the same file |
|
canvas.save(image_path, "PNG", optimize=True) |
|
|
|
print(f"✓ Processed: {os.path.basename(image_path)}") |
|
|
|
except Exception as e: |
|
print(f"✗ Error processing {image_path}: {str(e)}") |
|
|
|
def process_directory(directory_path, file_pattern="*.png"): |
|
""" |
|
Process all PNG files in a directory. |
|
|
|
Args: |
|
directory_path (str): Path to the directory containing PNG files |
|
file_pattern (str): Pattern to match files (default: "*.png") |
|
""" |
|
if not os.path.exists(directory_path): |
|
print(f"Error: Directory '{directory_path}' does not exist.") |
|
return |
|
|
|
# Find all PNG files matching the pattern |
|
search_pattern = os.path.join(directory_path, file_pattern) |
|
png_files = glob.glob(search_pattern) |
|
|
|
if not png_files: |
|
print(f"No PNG files found in '{directory_path}' matching pattern '{file_pattern}'") |
|
return |
|
|
|
print(f"Found {len(png_files)} PNG files to process...") |
|
|
|
# Process each file |
|
for png_file in png_files: |
|
resize_and_center_image(png_file) |
|
|
|
print(f"\nCompleted processing {len(png_files)} files.") |
|
|
|
def process_single_file(file_path): |
|
""" |
|
Process a single PNG file. |
|
|
|
Args: |
|
file_path (str): Path to the PNG file |
|
""" |
|
if not os.path.exists(file_path): |
|
print(f"Error: File '{file_path}' does not exist.") |
|
return |
|
|
|
if not file_path.lower().endswith('.png'): |
|
print(f"Error: File '{file_path}' is not a PNG file.") |
|
return |
|
|
|
print(f"Processing single file: {os.path.basename(file_path)}") |
|
resize_and_center_image(file_path) |
|
print("Processing complete.") |
|
|
|
def main(): |
|
parser = argparse.ArgumentParser(description="Resize PNG assets to 18x18px and center on 20x20px canvas") |
|
parser.add_argument("path", help="Path to PNG file or directory containing PNG files") |
|
parser.add_argument("--pattern", default="*.png", help="File pattern to match (default: *.png)") |
|
|
|
args = parser.parse_args() |
|
|
|
if os.path.isfile(args.path): |
|
process_single_file(args.path) |
|
elif os.path.isdir(args.path): |
|
process_directory(args.path, args.pattern) |
|
else: |
|
print(f"Error: '{args.path}' is not a valid file or directory.") |
|
|
|
if __name__ == "__main__": |
|
# If run without arguments, process the assets/Rat directory by default |
|
import sys |
|
if len(sys.argv) == 1: |
|
# Default to processing the assets/Rat directory |
|
script_dir = os.path.dirname(os.path.abspath(__file__)) |
|
assets_dir = os.path.join(script_dir, "assets", "Rat") |
|
if os.path.exists(assets_dir): |
|
print("No arguments provided. Processing assets/Rat directory by default...") |
|
process_directory(assets_dir) |
|
else: |
|
print("assets/Rat directory not found. Please provide a path as argument.") |
|
print("Usage: python resize_assets.py <path_to_file_or_directory>") |
|
else: |
|
main()
|
|
|