3bd2d9269f
- Created gameinfo.xml for the Mice! game, detailing its description, release date, developer, and genre. - Added mice.sh script to activate the conda environment and run the game. - Implemented colorize_assets.py as a placeholder for future asset colorization functionality. - Developed convert_audio.py to convert audio files to 8-bit unsigned format at 22100 Hz. - Introduced maze.py for generating mazes using Depth First Search (DFS) with a graphical interface. - Created resize_assets.py to resize PNG assets to 18x18 pixels and center them on a 20x20 canvas.
124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
#!/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()
|