extends SceneTree ## Tiles screenshots into one contact sheet (optionally cropped and scaled), for reviews and docs. ## Run: godot --headless --path . -s res://tools/luneraria/contact_sheet.gd -- --out=sheet.png --cols=5 \ ## [--crop=x,y,w,h] [--scale=0.5] a.png b.png ... func _init() -> void: var out: String = "sheet.png" var cols: int = 4 var crop := Rect2i() var scale: float = 1.0 var files: Array[String] = [] for arg: String in OS.get_cmdline_user_args(): if arg.begins_with("--out="): out = arg.get_slice("=", 1) elif arg.begins_with("--cols="): cols = int(arg.get_slice("=", 1)) elif arg.begins_with("--scale="): scale = float(arg.get_slice("=", 1)) elif arg.begins_with("--crop="): var v: PackedStringArray = arg.get_slice("=", 1).split(",") crop = Rect2i(int(v[0]), int(v[1]), int(v[2]), int(v[3])) else: files.append(arg) var tiles: Array[Image] = [] for path: String in files: var image := Image.load_from_file(path) if image == null: continue if crop.size.x > 0: image = image.get_region(crop) if scale != 1.0: image.resize(int(image.get_width() * scale), int(image.get_height() * scale), Image.INTERPOLATE_LANCZOS) tiles.append(image) if tiles.is_empty(): quit(1) return var w: int = tiles[0].get_width() var h: int = tiles[0].get_height() var rows: int = ceili(float(tiles.size()) / cols) var sheet := Image.create(w * mini(cols, tiles.size()), h * rows, false, Image.FORMAT_RGB8) for i: int in range(tiles.size()): var tile: Image = tiles[i] tile.convert(Image.FORMAT_RGB8) sheet.blit_rect(tile, Rect2i(0, 0, w, h), Vector2i((i % cols) * w, (i / cols) * h)) sheet.save_png(out) print("SHEET ", out, " ", sheet.get_size()) quit()