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

#!/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()