Initial commit: New industrial design with green theme
This commit is contained in:
110
crop_banners.py
Normal file
110
crop_banners.py
Normal file
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
|
||||
# Standard crop for 1300x1733 images (banner is ~400px tall)
|
||||
CROP_TOP_400 = 400 # Main category images
|
||||
CROP_TOP_80 = 80 # Smaller banners
|
||||
SKIP_CROP = 0
|
||||
|
||||
# Special: (crop_top, crop_bottom) for images needing both top and bottom crop
|
||||
CROP_BOTH = "both"
|
||||
|
||||
IMAGES_WITH_BANNERS = [
|
||||
# Main category images (1300x1733, 400px top banner)
|
||||
("2021/03/durgo_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/valve_000C.jpg", (400, 400)), # Has "Valve KITZ" at bottom too
|
||||
("2021/03/water-pump_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/water-treatment_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/grilles_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/realflex_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/extinguishers_000C.jpg", CROP_TOP_400),
|
||||
("2025/01/fencing_000C.jpg", CROP_TOP_400),
|
||||
("2025/01/balljet-cover_000C.jpg", CROP_TOP_400),
|
||||
("2025/01/thermobrek_cover_000C.jpg", CROP_TOP_400),
|
||||
("2025/01/pipe-and-other_000.jpg", CROP_TOP_400),
|
||||
("2025/01/pipe-coupling-machine_000.jpg", CROP_TOP_400),
|
||||
("2025/01/Hanger-Clamp-Bolt_000.jpg", CROP_TOP_400),
|
||||
("2025/09/IMG-cover-309251.png", CROP_TOP_400),
|
||||
# Pipe subcategory images (1300x1733, 400px top banner)
|
||||
("2021/03/ppr-pipe_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/hdpe-pipe_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/upvc-pipe_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/poloplast_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/syler_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/pvc-pipe_000C.jpg", CROP_TOP_400),
|
||||
("2021/03/xylent_000C.jpg", (400, 400)), # Has "เงียบ! 22 dB" at bottom
|
||||
("2021/03/hdpe-welding_000C-1.jpg", CROP_TOP_400),
|
||||
# Hanger images (different dimensions, 400px top banner)
|
||||
("2024/02/ADJUSTABLE_SPLIT_RING_HANGER_cover_01.jpg", CROP_TOP_400),
|
||||
("2024/02/ADJUSTABLE_CLEVIS_HANGER_cover_01.jpg", CROP_TOP_400),
|
||||
("2024/02/THREADED_ROD_cover_01.jpg", CROP_TOP_400),
|
||||
# Special cases - skip for now, handle separately
|
||||
("2021/02/Valve-KITZ.jpg", SKIP_CROP), # 800x648, different layout
|
||||
("2021/02/Grilles01logo.jpg", CROP_TOP_80),
|
||||
("2021/02/Banner-HDPE-wel-1024x382.jpg", SKIP_CROP), # Side text
|
||||
]
|
||||
|
||||
BASE_DIR = "/Users/kunthawatgreethong/Gitea/dealplustech/public/images"
|
||||
OUTPUT_DIR = "/Users/kunthawatgreethong/Gitea/dealplustech/public/images-clean"
|
||||
|
||||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||||
|
||||
|
||||
def get_dimensions(img_path):
|
||||
result = subprocess.run(
|
||||
["identify", "-format", "%w %h", img_path], capture_output=True, text=True
|
||||
)
|
||||
w, h = result.stdout.strip().split()
|
||||
return int(w), int(h)
|
||||
|
||||
|
||||
def crop_image(input_path, output_path, crop_amount):
|
||||
if crop_amount == 0:
|
||||
subprocess.run(["cp", input_path, output_path], check=True)
|
||||
return
|
||||
|
||||
w, h = get_dimensions(input_path)
|
||||
|
||||
if isinstance(crop_amount, tuple):
|
||||
crop_top, crop_bottom = crop_amount
|
||||
new_h = h - crop_top - crop_bottom
|
||||
cmd = [
|
||||
"magick",
|
||||
"convert",
|
||||
input_path,
|
||||
"-crop",
|
||||
f"{w}x{new_h}+0+{crop_top}",
|
||||
"+repage",
|
||||
output_path,
|
||||
]
|
||||
else:
|
||||
new_h = h - crop_amount
|
||||
cmd = [
|
||||
"magick",
|
||||
"convert",
|
||||
input_path,
|
||||
"-crop",
|
||||
f"{w}x{new_h}+0+{crop_amount}",
|
||||
"+repage",
|
||||
output_path,
|
||||
]
|
||||
subprocess.run(cmd, check=True)
|
||||
|
||||
|
||||
for rel_path, crop_amount in IMAGES_WITH_BANNERS:
|
||||
input_path = os.path.join(BASE_DIR, rel_path)
|
||||
output_path = os.path.join(OUTPUT_DIR, os.path.basename(rel_path))
|
||||
|
||||
if not os.path.exists(input_path):
|
||||
print(f"SKIP: {rel_path} (not found)")
|
||||
continue
|
||||
|
||||
try:
|
||||
crop_image(input_path, output_path, crop_amount)
|
||||
print(f"OK: {os.path.basename(rel_path)} (cropped {crop_amount}px from top)")
|
||||
except Exception as e:
|
||||
print(f"FAIL: {rel_path} - {e}")
|
||||
|
||||
print("\nDone!")
|
||||
Reference in New Issue
Block a user