Files
novafarma/scripts/utils/intelligent_resize.py

123 lines
4.3 KiB
Python

import os
import sys
import subprocess
SOURCE_DIR = "/Users/davidkotnik/Desktop/referencne slike 2"
# --- CONFIGURATION: LOGIC FOR RESIZING ---
# We define max dimension (width or height, whichever is larger).
# The aspect ratio is always preserved.
RESIZE_RULES = [
# --- MASSIVE (512px - 600px) ---
# Buildings, large trees, Gronk (Giant Troll)
{
"keywords": ["zgradba", "hisa", "skedenj", "drevo_veliko", "gronk", "troll", "structure", "objekt", "rudnik", "vhod"],
"size": 512
},
# --- MEDIUM-LARGE (350px - 400px) ---
# Regular trees, large animals, vehicles
{
"keywords": ["drevo", "krava", "konj", "medved", "auto", "traktor", "agregat", "sod", "kontejner", "vodnjak", "koca", "sotor"],
"size": 384
},
# --- MEDIUM (Standard Character Size: 256px) ---
# Humans, zombies, standard props, furniture
{
"keywords": ["zombi", "kai", "ana", "ata", "mama", "love", "character", "kip", "postelja", "vreca", "miza", "stol", "klop", "kamen_srednji", "ograja"],
"size": 256
},
# --- SMALL-MEDIUM (128px - 192px) ---
# Small animals, dogs, inventory items held in hand
{
"keywords": ["pes", "susi", "macka", "kokos", "zajec", "svinja", "ovca", "orodje", "kramp", "sekira", "motika", "lopata", "meč", "puska", "kamen", "grm", "trava"],
"size": 192
},
# --- SMALL (64px - 96px) ---
# Insects, small items, icons, UI elements
{
"keywords": ["insekt", "mravlja", "cebela", "metulj", "hrosc", "muha", "komar", "polz", "dezevnik", "ikona", "item", "seme", "steklenica", "hrana", "ui", "gumb"],
"size": 96
}
]
DEFAULT_SIZE = 256 # Fallback size if no keyword matches
def install_dependencies():
pass # Pillow should be installed from previous step
def get_target_size(filename):
"""Determine size based on filename keywords."""
fname = filename.lower()
for rule in RESIZE_RULES:
for keyword in rule["keywords"]:
if keyword in fname:
# Special case logic could go here (e.g. "zombi_otrok" smaller than "zombi")
if "otrok" in fname and rule["size"] > 128:
return int(rule["size"] * 0.7) # Kids are 70% size
return rule["size"]
return DEFAULT_SIZE
def intelligent_resize():
if not os.path.exists(SOURCE_DIR):
print(f"Directory not found: {SOURCE_DIR}")
return
try:
from PIL import Image
except ImportError:
print("PIL/Pillow not found. Please pip install Pillow.")
return
files = [f for f in os.listdir(SOURCE_DIR) if f.lower().endswith('.png')]
if not files:
print("No PNG files found.")
return
print(f"Found {len(files)} PNGs. Starting intelligent resizing...")
for filename in files:
filepath = os.path.join(SOURCE_DIR, filename)
try:
target_size = get_target_size(filename)
with Image.open(filepath) as img:
# Calculate new size preserving aspect ratio
width, height = img.size
aspect_ratio = width / height
if width > height:
new_width = target_size
new_height = int(target_size / aspect_ratio)
else:
new_height = target_size
new_width = int(target_size * aspect_ratio)
# High quality resampling
resized_img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
# Apply Sharpening (Unsharp Mask) to keep details (piercings!) crisp
# Radius 2, Percent 150 is a good standard for "Concept Art" sharpness
try:
from PIL import ImageFilter
resized_img = resized_img.filter(ImageFilter.UnsharpMask(radius=1.5, percent=130, threshold=3))
except ImportError:
pass # Should be in PIL
# Save
resized_img.save(filepath)
print(f"✅ Resized {filename}: {width}x{height} -> {new_width}x{new_height} (Target: {target_size}px)")
except Exception as e:
print(f"❌ Error resizing {filename}: {e}")
if __name__ == "__main__":
intelligent_resize()