I need to do the following thing. Having multiple png files in folder with a naming convention set:
1.png 1_m.png, 2.png 2_m.png (and so on).
The png files have the same width and height (320 x 360 px).
Now the script should do the following:
take the files 1.png 1_m.png and create a new file in which the 1_m.png is placed on the left and 1.png on the right merge those two on one layer and save it as lets say 1_done.png,
run this action on all files in the folder.
This doesn't have to be a Photoshop script I've searched the web but couldn't find any useful solution. Also nothing is set in stone here, the files could be in different folders what ever would be the simplest solution.
My Photoshop version is CS5
This script will do what you want. Put all the files in a directory and then run the script using automate batch -> script. It'll find an image without and underscore in the the file-name and then open it's paired name file (with "_m"), put them side by side and save it out with _done added on to the file-name.
//pref pixels
app.preferences.rulerUnits = Units.PIXELS;
var srcDoc = app.activeDocument;
// call the current document
var srcDoc = app.activeDocument;
// set original width and height
var imageW = srcDoc.width.value;
var imageH = srcDoc.height.value;
// get the info out of the source doc
var fileName = srcDoc.name;
var docName = fileName.substring(0,fileName.length -4);
var filePath = srcDoc.path.toString();
var fileExt = fileName.substring(fileName.length -4, fileName.length);
var nameCheck = fileName.substring(0,fileName.indexOf("_"));
if (nameCheck <1)
{
// no underscore so we need to open it's namesake
// alert(nameCheck)
var filePair = filePath + "/" + docName + "_m" + fileExt;
openThisFile(filePair)
activeDocument.selection.selectAll()
activeDocument.selection.copy();
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = srcDoc;
activeDocument.resizeCanvas(imageW *2, imageH, AnchorPosition.MIDDLELEFT);
selectRect(0, imageW, imageW*2, imageH)
activeDocument.paste()
activeDocument.flatten();
var newName = filePath + "/" + docName + "_done" + fileExt
saveMe(newName)
}
else
{
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
function openThisFile(masterFileNameAndPath)
{
var fileRef = new File(masterFileNameAndPath)
if (fileRef.exists)
//open that doc
{
app.open(fileRef);
}
else
{
alert("error opening " + masterFileNameAndPath)
}
}
function selectRect(top, left, right, bottom)
{
srcDoc.selection.deselect()
// =======================================================
var id1 = charIDToTypeID( "setd" );
var desc1 = new ActionDescriptor();
var id2 = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var id3 = charIDToTypeID( "Chnl" );
var id4 = charIDToTypeID( "fsel" );
ref1.putProperty( id3, id4 );
desc1.putReference( id2, ref1 );
var id5 = charIDToTypeID( "T " );
var desc2 = new ActionDescriptor();
var id6 = charIDToTypeID( "Top " );
var id7 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id6, id7, top );
var id8 = charIDToTypeID( "Left" );
var id9 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id8, id9, left );
var id10 = charIDToTypeID( "Btom" );
var id11 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id10, id11, bottom );
var id12 = charIDToTypeID( "Rght" );
var id13 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id12, id13, right );
var id16 = charIDToTypeID( "Rctn" );
desc1.putObject( id5, id16, desc2 );
executeAction( id1, desc1, DialogModes.NO );
}
function saveMe(fPath)
{
// save out the image
var pngFile = new File(fPath);
pngSaveOptions = new PNGSaveOptions();
pngSaveOptions.embedColorProfile = true;
pngSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
pngSaveOptions.matte = MatteType.NONE; pngSaveOptions.quality = 1;
activeDocument.saveAs(pngFile, pngSaveOptions, false, Extension.LOWERCASE);
// close that saved png
app.activeDocument.close()
}
I would do this with ImageMagick which is available for free for Windows, OSX and Linux - in fact it is installed on most Linux distros anyway.
The crux of it is to use ImageMagick's convert
command to append two images side by side, basically like this:
convert left.png right.png +append out.png
So the script looks like this - (nearly half of it is comments):
#!/bin/bash
for i in [0-9]*_m.png; do
# Deduce name of left image
left="$i"
# Deduce name of right image
right="${i/_m/}"
# Deduce name of output image
done="${i/_m/_done}"
# Merge the little devils
convert "$left" "$right" +append "$done"
done
If we start with images like this:
and
It will generate this for all pairs: