#!/usr/bin/pike /* * tiler.pike * * Tiles NxM different pngs into a single png * * History: * 1/07/2019 Creation * 5/11/2019 Fix erroneous 1-pixel border around every tile * 9/03/2023 Support transparency * * Author: Dario Rodriguez dario@softhome.net * This program is distributed under the terms of the GNU GPL v2.1+ */ int main(int argc, array(string) argv) { int a4w,a4h; int maxx,maxy; int px,py; string destfilename; int total; Image.Image image,alpha; Image.Layer l; mapping imagemapping; array(Image.Layer) layers=({}); if(argc<4 || (argc>1 && argv[1]=="--help")) { Stdio.werror("Syntax: "+argv[0]+" [ [...]] \n"); Stdio.werror("Example: "+argv[0]+" 3 2 file1.png file2.png file3.png file4.png file5.png file6.png dest.png\n"); Stdio.werror("Example result: dest.png\n"); return(1); } a4w=(int)argv[1]; a4h=(int)argv[2]; destfilename=argv[sizeof(argv)-1]; array(string) infiles=argv[3..sizeof(argv)-2]; maxx=maxy=1; write("* Calculating tile size\n"); foreach(infiles, string f) { image=Image.load(f); if(image->xsize()>maxx) maxx=image->xsize(); if(image->ysize()>maxy) maxy=image->ysize(); } image=Image.Image(maxx*a4w,maxy*a4h,255,255,255); alpha=Image.Image(maxx*a4w,maxy*a4h,0,0,0); l=Image.Layer(image,alpha,"normal"); l->set_offset(0,0); layers+=({l}); px=py=0; total=0; foreach(infiles, string f) { write("* Processing "+f+"...\n"); imagemapping=Image._load(f); image=imagemapping["image"]; alpha=imagemapping["alpha"]; l=Image.Layer(image,alpha,"normal"); l->set_offset(px*(maxx),py*(maxy)); layers+=({l}); //result->paste(img,px*(maxx),py*(maxy)); px++; if(px>=a4w) { px=0; py++; } total++; } l=Image.lay(layers); l->set_offset(0,0); write("* Writing "+destfilename+"...\n"); Stdio.write_file(destfilename,Image.PNG.encode(l->image(),(["alpha":l->alpha()]))); write("tiled "+total+" images into "+destfilename+". Process finished.\n"); return(0); }