#!/usr/bin/pike /* * paster.pike * * Resize a png into another png * * History: * 28/09/2020 Creation from resizer.pike * * 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 i; string geom; mapping imagemapping; int xsize,ysize; int xoff,yoff; string destfilename; Image.Image image,alpha; array(Image.Layer) layers=({}); Image.Layer l; if(argc<4 || (argc%2)!=0 || (argc>1 && argv[1]=="--help")) { Stdio.werror("Syntax: "+argv[0]+" <geom1> { <file1.png> | <htmlcolor1> } [<geom2> { <file2.png> | <htmlcolor2> } [...]] <outfile.png>\n"); Stdio.werror("Example: "+argv[0]+" 200x300+0+0 bg.png 150x0+25+25 image.png 100x1+0+0 \"#ff0000\" dest.png\n"); Stdio.werror("Example result: dest.png\n"); return(1); } destfilename=argv[argc-1]; write("* Loading images...\n"); for(i=1;(i+1)<argc;i+=2) { geom=argv[i]; if(sizeof(argv[i+1])>1 && argv[i+1][0]=='#') { string htmlcolor=argv[i+1]; int r,g,b,a; a=0; htmlcolor-="#"; sscanf(htmlcolor[0..1],"%x",r); sscanf(htmlcolor[2..3],"%x",g); sscanf(htmlcolor[4..5],"%x",b); if(sizeof(htmlcolor)>6) sscanf(htmlcolor[6..7],"%x",a); write("r:"+r+" g:"+g+" b:"+b+" a:"+a+"\n"); image=Image.Image(1,1,r,g,b); imagemapping=([ "image":image, "alpha":Image.Image(1,1,255-a,255-a,255-a) ]); } else { imagemapping=Image._load(argv[i+1]); } xsize=ysize=xoff=yoff=0; if(sizeof(geom/"x")>1) xsize=(int) (geom/"x")[0]; if(sizeof(geom/"x")>1) ysize=(int) (((geom/"x")[1])/"+")[0]; if(sizeof(geom/"+")>1) xoff=(int) (geom/"+")[1]; if(sizeof(geom/"+")>2) yoff=(int) (geom/"+")[2]; image=imagemapping["image"]; alpha=imagemapping["alpha"]; xsize=(xsize!=0)?xsize:(ysize==0)?image->xsize():ysize*image->xsize()/image->ysize(); ysize=(ysize!=0)?ysize:(xsize==0)?image->ysize():xsize*image->ysize()/image->xsize(); if(xsize!=image->xsize() || ysize!=image->ysize()) { image=image->scale(xsize,ysize); if(!intp(alpha)) alpha=alpha->scale(xsize,ysize); } if(intp(alpha)) alpha=Image.Image(xsize,ysize,255,255,255); l=Image.Layer(image,alpha,"normal"); l->set_offset(xoff,yoff); layers+=({l}); } 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("* Finished successfully\n"); return(0); }