-1

I need to combine two series of images (both the same resolution, saved as JPG files) into a single JPG file with the images side by side to each other. I have tried doing this with Photoshop CS6 actions but to no avail... I have searched the internet for possible solutions but as it turns out programming knowledge is required to write a script to perform such a function. I would like to have any help possible with the following:

My file names are as such:

Series one: bone00001.jpg, bone00002.jpg ... bone00060.jpg Series two: st00001.jpg, st00002.jpg ... st00060.jpg

I want them combined side by side so that the "bone" series is on the left, and the "st" series is on the right, and the final series exported as done00001.jpg ... done00060.jpg

Would anyone be able to help me with this Photoshop script?

Magoo
  • 77,302
  • 8
  • 62
  • 84
Dr. C
  • 9
  • 1
  • 1

2 Answers2

1

Adam D is right - you're better off asking at the Adobe forums. But as luck would have it your request is very similar to a question asked a while back. The script is crude; but it will do what you want: The images need to be the same size. If the bone images are smaller than the scan images it'll look a mess and won't work.

Save this out as .jsx file. It can be accessed within PS from the file > scripts menu.

Load in one of the bone images, run the script - which will then find the matching scan image and put them side by side and save them out as bone_XXXX_done.jpg (where XXXX is number)

    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("bone"));

if (nameCheck <1)
{
   var fileNum = fileName.substring(4,fileName.length -4);
   // no underscore so we need to open it's namesake
   // alert(nameCheck)
   var filePair = filePath + "/" + "st" + fileNum + 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 as jpeg
var jpgFile = new File(fPath);
jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 12;

activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);

// close that saved jpg
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
Community
  • 1
  • 1
Ghoul Fool
  • 6,249
  • 10
  • 67
  • 125
0

Instead of scripting, there are two main options you could do.

  1. You could create your first photoshop file as a template where you position each one of those pictures how you want and make sure they are each a different layer. You then name those layers and setup variables within photoshop, then export each one. I just followed this video and it was pretty easy: https://www.youtube.com/watch?v=1PYu9dsaE5I It could also be used for much more complex situations.

I had to take one extra step because it would only export each file as a photoshop file (.psd). I then did File > Scripts > Image Processor to process a whole folder of PSDs into JPGs.

  1. You could also use the Contacts Sheet function in Photoshop (File > Automate > Contacts Sheet II). In order to do this, your file names will have to be renamed so that the two files being put side by side/together appear in sequence by their name. You could rename your files 001bones.jpg and 001st.jpg. There are lots of ways to bulk rename files, but I've found this GUI pretty easy to quickly do things.

https://www.bulkrenameutility.co.uk/Download.php

Option 1 has much more flexibility in doing more complex tasks. Option 2 is more limited but will do what you want. Since Option 2 does require that all combined files be open at the same time, I would limit this to smaller data sets. For PNG files, see the end of my other post here