script for arrangement of images

Use this Forum for Beta-Testing your Photoshop Scripts

Moderators: xbytor, DavideBarranca, Paul MR

pfaffenbichler

script for arrangement of images

Postby pfaffenbichler » Sun Mar 13, 2011 10:35 am

It would be nice if someone could give this Script a look-over to see if I have overlooked something regarding either performance or logic.
It is an arrangement-script that attempts to arrange selected psd-, tif-, jpg- and pdf-files in lines within the rectangular bounds of a Selection or in relation to an open file’s dimensions.

Michael L Hale and Muppet Mark thankworthily provided help with getting images’ dimensions before placing them, which I think speeded up the Script’s performance considerably.
As for multi-page pdfs I used the easier way of opening them with a try-clause to get their page-number, because while some time ago I also received help from various posters regarding the evaluation pdf-pagecounts none of the methods seemed to be successful with all possible issues pdfs may provide.

Thanks in advance,
regards,
pfaffenbichler

Code: Select all// arranges the selected jpg, tif, psd  and pdf in lines of the same height without margins within the bounds of a selection or a set boundary within the file;
// thanks to michael l hale and muppet mark;
// to avoid the trouble of determining pdf-page counts and potential problems with pdfs with differently sized pages pdfs are temporarily opened, then placed;
// for CS5;
// 2011, use it at your own risk;
#target photoshop
if (app.documents.length == 0) {
   var myDocument = app.documents.add(UnitValue (210, "mm"), UnitValue (297, "mm"), 300, "new", NewDocumentMode.RGB, DocumentFill.TRANSPARENT)
   }
else {myDocument = app.activeDocument};
// set to pixels;
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
// get selection bounds or create array based on image’s size;
try {var theArray = myDocument.selection.bounds}
catch (e) {var theArray = [50, 50, myDocument.width - 50, myDocument.height - 50]};
if ( theArray[2] - theArray[0] > 10 && theArray[3] - theArray[1] > 10) {
// select files;
   var theFiles = File.openDialog ("please select files", getFiles, true);
// do the arrangement
   if (theFiles) {placeInLines (myDocument, theFiles, theArray)}
   }
else {alert ("file to small")};
app.preferences.rulerUnits = originalRulerUnits;
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////// function to place images in lines //////
function placeInLines (myDocument, theFiles, theArray) {
// change pref;
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
setToAccelerated();
app.togglePalettes();
var check = turnOffRescale ();
// create the arrangement;
if (theFiles.length > 0) {
myDocument.activeLayer = myDocument.layers[0];
// create masked group;
var theGroup = myDocument.layerSets.add();
myDocument.selection.select([[theArray[0], theArray[1]], [theArray[2], theArray[1]], [theArray[2], theArray[3]], [theArray[0], theArray[3]]]);
addLayerMask();
theGroup.name = "arrangement";
// determine the array’s values;
var areaWidth = theArray[2] - theArray[0];
var areaHeight = theArray[3] - theArray[1];
var theDocResolution = myDocument.resolution;
var areaRelation = areaHeight / areaWidth;
// center of placed non-pdf images;
var centerX = Number(myDocument.width / 2);
var centerY = Number(myDocument.height / 2);
// suppress dialogs;
var theDialogSettings = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
var pdfSinglePages = new Array;
var nonPDFs = new Array;
var theDimPDFs = new Array;
var theLength = 0;
// collect the files’ measurements;
var theDimensions = new Array;
var theLengths = new Array;
// array to collect both files and placed pdf-pages;
var theseFiles = new Array;
var theLength = 0;
// collect the pdf files’ measurements;
for (var o = 0; o < theFiles.length; o++) {
    var thisFile = theFiles[o];
// check for pdf;
    if (thisFile.name.slice(-4).match(/\.(pdf)$/i)) {
// determine the number of elements;
      var myCounter = 1;
      var myBreak = false;
      while(myBreak == false) {
         try {
// open and close to check if page exists;
            openPDF (thisFile, myCounter);
// place as so;
            var thePlaced = placePDFPage(thisFile, myCounter, theGroup);
            thePlaced.name = thisFile.name + myCounter;
            var width = thePlaced.bounds[2] - thePlaced.bounds[0];
            var height = thePlaced.bounds[3] - thePlaced.bounds[1];
            theDimensions.push([width, height, myDocument.resolution, myDocument.resolution]);
            theRelativeWidth = 100 / height * width;
            theLength = theLength + theRelativeWidth;
            myCounter++;
// enter the new file into the array;
            theseFiles.push(thePlaced);
            }
         catch (e) {myBreak = true};
         };
      };
   else {
      theseFiles.push(thisFile);
      var theDim = getDimensions(thisFile);
      theDimensions.push(theDim);
      theRelativeWidth = 100 / theDim[1] * theDim[0];
      theLength = theLength + theRelativeWidth;      
      }
   };
// reset dialogmodes;
app.displayDialogs = DialogModes.ERROR;
// get relation of height and width;
var theFilesRelation = 100 / theLength;
// determine the necessary number of lines and the heights;
var linesNumber = Math.ceil(Math.sqrt(1 / (100 / theLength / areaRelation)));
var theLineHeight = Math.round(areaHeight / linesNumber);
var theLineHeightC = Math.ceil(areaHeight / linesNumber);
// create the layers;
var theNumber = 0;
var theAdded = 0;
var y = theLineHeight / 2;
var theLinesDone = 0;
var repeat = false;
// go through the bunch;
while (theLinesDone < linesNumber) {
// add placed image’s width;
    var thisLineWidth = 0 + theAdded;
// get the vertical offset;
    if (theLinesDone != 0) {y = y + theLineHeight};
//
    while (thisLineWidth < areaWidth && theNumber < theseFiles.length) {
      var thisFile = theseFiles[theNumber];
// if placed layer from pdfs;
      if (thisFile.typename == "ArtLayer") {
         var theFactor = Number (theLineHeightC / theDimensions[theNumber][1] * theDimensions[theNumber][2] / theDocResolution * 100);
         var theNewWidth = Math.round(theDimensions[theNumber][0] * theFactor / 100 * theDocResolution / theDimensions[theNumber][2]);
// if image has not yet been used;
         if (repeat == false) {
            var offsetX = theNewWidth / 2 + thisLineWidth - centerX + theArray[0];
            var offsetY = y - centerY + theArray[1];
            var theLayer = transformLayer (thisFile, theFactor, offsetX, offsetY);
            }
// if image has already been placed before;
         else {
            var offsetX = theNewWidth / 2 + thisLineWidth - ((thisFile.bounds[2] - thisFile.bounds[0]) / 2 + thisFile.bounds[0]) + theArray[0];
            var offsetY = y - ((thisFile.bounds[3] - thisFile.bounds[1]) / 2 + thisFile.bounds[1]) + theArray[1];
            var theLayer = thisFile.duplicate(theGroup, ElementPlacement.PLACEATBEGINNING);
            theLayer.translate(offsetX, offsetY * (-1) + theArray[1] * 2);
            }
         }
// if file;
      else {
         var theFactor = Number (theLineHeightC / theDimensions[theNumber][1] * theDimensions[theNumber][2] / theDocResolution * 100);
         var theNewWidth = Math.round(theDimensions[theNumber][0] * theFactor / 100 * theDocResolution / theDimensions[theNumber][2]);
         var offsetX = theNewWidth / 2 + thisLineWidth - centerX + theArray[0];
         var offsetY = y - centerY + theArray[1];
         var theLayer = placeScaleFile (thisFile, offsetX, offsetY, theFactor, theFactor);
         myDocument.activeLayer.move(theGroup, ElementPlacement.PLACEATBEGINNING)
         };
// increase the count for images;
      theNumber++;
      thisLineWidth = thisLineWidth + theNewWidth;
// rasterize the layer to reduce file size;
      var theLayer = rasterize(theLayer);
// if scaled image is wider than the document;
      if (theNewWidth > areaWidth && theLinesDone < linesNumber) {
         while (thisLineWidth > areaWidth) {
            var theLayer = theLayer.duplicate(theLayer, ElementPlacement.PLACEBEFORE);
            myDocument.activeLayer = theLayer;
            theLayer.translate (areaWidth * (-1), theLineHeight);
            var theAdded = theLayer.bounds[2] - theArray[0];
            thisLineWidth = theLayer.bounds[2] - theArray[0];
            y = y + theLineHeight;
            theLinesDone++
            }
         }
        else {
// if line overreaches the edge, copy and move to next line;
         if (thisLineWidth > areaWidth && theLinesDone < linesNumber) {
            var theLayer = theLayer.duplicate(theLayer, ElementPlacement.PLACEBEFORE);
            myDocument.activeLayer = theLayer;
            theLayer.translate (areaWidth * (-1), theLineHeight);
            var theAdded = theLayer.bounds[2] - theArray[0];
            }
         };
// loop back to the first image;
        if (theNumber == theseFiles.length) {
         if (repeat == false) {
            var repeat = confirm("repeat images to fill format?", false, "repeat")
            };
         if (repeat == true) {theNumber = 0}
         };
        };
// increase the count for lines;
    theLinesDone++
    };
};
// reset;
app.togglePalettes();
turnOnRescale (check);
app.preferences.rulerUnits = originalRulerUnits;
};
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////// add layer mask //////
function addLayerMask () {
var idMk = charIDToTypeID( "Mk  " );
var desc168 = new ActionDescriptor();
var idNw = charIDToTypeID( "Nw  " );
var idChnl = charIDToTypeID( "Chnl" );
desc168.putClass( idNw, idChnl );
var idAt = charIDToTypeID( "At  " );
var ref99 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref99.putEnumerated( idChnl, idChnl, idMsk );
desc168.putReference( idAt, ref99 );
var idUsng = charIDToTypeID( "Usng" );
var idUsrM = charIDToTypeID( "UsrM" );
var idRvlS = charIDToTypeID( "RvlS" );
desc168.putEnumerated( idUsng, idUsrM, idRvlS );
executeAction( idMk, desc168, DialogModes.NO );
// unlink;
// =======================================================
var idsetd = charIDToTypeID( "setd" );
    var desc10 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref3 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref3.putEnumerated( idLyr, idOrdn, idTrgt );
    desc10.putReference( idnull, ref3 );
    var idT = charIDToTypeID( "T   " );
        var desc11 = new ActionDescriptor();
        var idUsrs = charIDToTypeID( "Usrs" );
        desc11.putBoolean( idUsrs, false );
    var idLyr = charIDToTypeID( "Lyr " );
    desc10.putObject( idT, idLyr, desc11 );
executeAction( idsetd, desc10, DialogModes.NO );
};
////// playback to accelerated //////
function setToAccelerated () {
   var idsetd = charIDToTypeID( "setd" );
   var desc1 = new ActionDescriptor();
   var idnull = charIDToTypeID( "null" );
      var ref1 = new ActionReference();
      var idPrpr = charIDToTypeID( "Prpr" );
      var idPbkO = charIDToTypeID( "PbkO" );
      ref1.putProperty( idPrpr, idPbkO );
      var idcapp = charIDToTypeID( "capp" );
      var idOrdn = charIDToTypeID( "Ordn" );
      var idTrgt = charIDToTypeID( "Trgt" );
      ref1.putEnumerated( idcapp, idOrdn, idTrgt );
   desc1.putReference( idnull, ref1 );
   var idT = charIDToTypeID( "T   " );
      var desc2 = new ActionDescriptor();
      var idperformance = stringIDToTypeID( "performance" );
      var idperformance = stringIDToTypeID( "performance" );
      var idaccelerated = stringIDToTypeID( "accelerated" );
      desc2.putEnumerated( idperformance, idperformance, idaccelerated );
   var idPbkO = charIDToTypeID( "PbkO" );
   desc1.putObject( idT, idPbkO, desc2 );
   executeAction( idsetd, desc1, DialogModes.NO );
   };
////// get psds, tifs and jpgs from files //////
function getFiles (theFile) {
    if (theFile.name.match(/\.(jpg|tif|psd|pdf|)$/i)) {
        return true
        };
   };
////// place //////
function placeScaleFile (file, xOffset, yOffset, theScale) {
// =======================================================
var idPlc = charIDToTypeID( "Plc " );
    var desc5 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
    desc5.putPath( idnull, new File( file ) );
    var idFTcs = charIDToTypeID( "FTcs" );
    var idQCSt = charIDToTypeID( "QCSt" );
    var idQcsa = charIDToTypeID( "Qcsa" );
    desc5.putEnumerated( idFTcs, idQCSt, idQcsa );
    var idOfst = charIDToTypeID( "Ofst" );
        var desc6 = new ActionDescriptor();
        var idHrzn = charIDToTypeID( "Hrzn" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc6.putUnitDouble( idHrzn, idPxl, xOffset );
        var idVrtc = charIDToTypeID( "Vrtc" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc6.putUnitDouble( idVrtc, idPxl, yOffset );
    var idOfst = charIDToTypeID( "Ofst" );
    desc5.putObject( idOfst, idOfst, desc6 );
    var idWdth = charIDToTypeID( "Wdth" );
    var idPrc = charIDToTypeID( "#Prc" );
    desc5.putUnitDouble( idWdth, idPrc, theScale );
    var idHght = charIDToTypeID( "Hght" );
    var idPrc = charIDToTypeID( "#Prc" );
    desc5.putUnitDouble( idHght, idPrc, theScale );
    var idLnkd = charIDToTypeID( "Lnkd" );
    desc5.putBoolean( idLnkd, true );
executeAction( idPlc, desc5, DialogModes.NO );
return myDocument.activeLayer;
};
////// place a pdf //////
function placePDFPage (theImage, x, theLayerSet) {
   // =======================================================
var idPlc = charIDToTypeID( "Plc " );
    var desc3 = new ActionDescriptor();
    var idAs = charIDToTypeID( "As  " );
        var desc4 = new ActionDescriptor();
        var idfsel = charIDToTypeID( "fsel" );
        var idpdfSelection = stringIDToTypeID( "pdfSelection" );
        var idpage = stringIDToTypeID( "page" );
        desc4.putEnumerated( idfsel, idpdfSelection, idpage );
        var idPgNm = charIDToTypeID( "PgNm" );
        desc4.putInteger( idPgNm, x );
        var idCrop = charIDToTypeID( "Crop" );
        var idcropTo = stringIDToTypeID( "cropTo" );
        var idtrimBox = stringIDToTypeID( "trimBox" );
        desc4.putEnumerated( idCrop, idcropTo, idtrimBox );
    var idPDFG = charIDToTypeID( "PDFG" );
    desc3.putObject( idAs, idPDFG, desc4 );
    var idnull = charIDToTypeID( "null" );
    desc3.putPath( idnull, new File( theImage ) );
    var idFTcs = charIDToTypeID( "FTcs" );
    var idQCSt = charIDToTypeID( "QCSt" );
    var idQcsa = charIDToTypeID( "Qcsa" );
    desc3.putEnumerated( idFTcs, idQCSt, idQcsa );
    var idOfst = charIDToTypeID( "Ofst" );
        var desc5 = new ActionDescriptor();
        var idHrzn = charIDToTypeID( "Hrzn" );
        var idRlt = charIDToTypeID( "#Rlt" );
        desc5.putUnitDouble( idHrzn, idRlt, 0.000000 );
        var idVrtc = charIDToTypeID( "Vrtc" );
        var idRlt = charIDToTypeID( "#Rlt" );
        desc5.putUnitDouble( idVrtc, idRlt, -0.000000 );
    var idOfst = charIDToTypeID( "Ofst" );
    desc3.putObject( idOfst, idOfst, desc5 );
    var idAntA = charIDToTypeID( "AntA" );
    desc3.putBoolean( idAntA, true );
executeAction( idPlc, desc3, DialogModes.NO );
// move forward;
app.activeDocument.activeLayer.move(theLayerSet, ElementPlacement.PLACEATBEGINNING);
return app.activeDocument.activeLayer
};
////// open pdf //////
function openPDF (theImage, x) {
// define pdfopenoptions;
var pdfOpenOpts = new PDFOpenOptions;
pdfOpenOpts.antiAlias = true;
pdfOpenOpts.bitsPerChannel = BitsPerChannelType.EIGHT;
pdfOpenOpts.cropPage = CropToType.TRIMBOX;
pdfOpenOpts.mode = OpenDocumentMode.CMYK;
pdfOpenOpts.resolution = 10;
pdfOpenOpts.suppressWarnings = true;
pdfOpenOpts.usePageNumber  = true;
// suppress dialogs;
var theDialogSettings = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
//
pdfOpenOpts.page = x;
var thePdf = app.open(theImage, pdfOpenOpts);
thePdf.close(SaveOptions.DONOTSAVECHANGES);
// reset dialogmodes;
app.displayDialogs = theDialogSettings;
};

////// rasterize //////
function rasterize (theLayer) {
app.activeDocument.activeLayer = theLayer;
if (theLayer.kind == LayerKind.SMARTOBJECT) {
// rasterize;
var id631 = charIDToTypeID( "slct" );
var desc125 = new ActionDescriptor();
var id632 = charIDToTypeID( "null" );
var ref83 = new ActionReference();
var id633 = charIDToTypeID( "Mn  " );
var id634 = charIDToTypeID( "MnIt" );
var id635 = stringIDToTypeID( "rasterizePlaced" );
ref83.putEnumerated( id633, id634, id635 );
desc125.putReference( id632, ref83 );
executeAction( id631, desc125, DialogModes.NO );
};
return app.activeDocument.activeLayer
};
////// turn off preference to scale placed image //////
function turnOffRescale () {
// determine if the resize prefernce is on;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("capp"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var appDesc = executeActionGet(ref);
var prefDesc = appDesc.getObjectValue(charIDToTypeID( "GnrP" ));
var theResizePref = prefDesc.getBoolean(stringIDToTypeID( "resizePastePlace" ));
// turn off resize image during place;
if (theResizePref == true);{
// =======================================================
var idsetd = charIDToTypeID( "setd" );
    var desc12 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref4 = new ActionReference();
        var idPrpr = charIDToTypeID( "Prpr" );
        var idGnrP = charIDToTypeID( "GnrP" );
        ref4.putProperty( idPrpr, idGnrP );
        var idcapp = charIDToTypeID( "capp" );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref4.putEnumerated( idcapp, idOrdn, idTrgt );
    desc12.putReference( idnull, ref4 );
    var idT = charIDToTypeID( "T   " );
        var desc13 = new ActionDescriptor();
        var idresizePastePlace = stringIDToTypeID( "resizePastePlace" );
        desc13.putBoolean( idresizePastePlace, false );
    var idGnrP = charIDToTypeID( "GnrP" );
    desc12.putObject( idT, idGnrP, desc13 );
executeAction( idsetd, desc12, DialogModes.NO );
};
return theResizePref
};
////// turn on preference to scale plced image //////
function turnOnRescale (check) {
if (check == true) {
// =======================================================
var idsetd = charIDToTypeID( "setd" );
    var desc14 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref5 = new ActionReference();
        var idPrpr = charIDToTypeID( "Prpr" );
        var idGnrP = charIDToTypeID( "GnrP" );
        ref5.putProperty( idPrpr, idGnrP );
        var idcapp = charIDToTypeID( "capp" );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref5.putEnumerated( idcapp, idOrdn, idTrgt );
    desc14.putReference( idnull, ref5 );
    var idT = charIDToTypeID( "T   " );
        var desc15 = new ActionDescriptor();
        var idresizePastePlace = stringIDToTypeID( "resizePastePlace" );
        desc15.putBoolean( idresizePastePlace, true );
    var idGnrP = charIDToTypeID( "GnrP" );
    desc14.putObject( idT, idGnrP, desc15 );
executeAction( idsetd, desc14, DialogModes.NO );
}
};
////// load pdf as smart object //////
function transformLayer (layer, percentage, xOffset, yOffset) {
app.activeDocument.activeLayer = layer;
// =======================================================
var idTrnf = charIDToTypeID( "Trnf" );
    var desc4 = new ActionDescriptor();
    var idFTcs = charIDToTypeID( "FTcs" );
    var idQCSt = charIDToTypeID( "QCSt" );
    var idQcsa = charIDToTypeID( "Qcsa" );
    desc4.putEnumerated( idFTcs, idQCSt, idQcsa );
    var idOfst = charIDToTypeID( "Ofst" );
        var desc5 = new ActionDescriptor();
        var idHrzn = charIDToTypeID( "Hrzn" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc5.putUnitDouble( idHrzn, idPxl, xOffset );
        var idVrtc = charIDToTypeID( "Vrtc" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc5.putUnitDouble( idVrtc, idPxl, yOffset );
    var idOfst = charIDToTypeID( "Ofst" );
    desc4.putObject( idOfst, idOfst, desc5 );
    var idWdth = charIDToTypeID( "Wdth" );
    var idPrc = charIDToTypeID( "#Prc" );
    desc4.putUnitDouble( idWdth, idPrc, percentage );
    var idHght = charIDToTypeID( "Hght" );
    var idPrc = charIDToTypeID( "#Prc" );
    desc4.putUnitDouble( idHght, idPrc, percentage );
    var idLnkd = charIDToTypeID( "Lnkd" );
    desc4.putBoolean( idLnkd, true );
    var idAntA = charIDToTypeID( "AntA" );
    desc4.putBoolean( idAntA, true );
executeAction( idTrnf, desc4, DialogModes.NO );
//
return app.activeDocument.activeLayer
};
////// function to get file’s dimensions, thanks to michael l hale //////
function getDimensions( file ){
////////////////////////////////////   
function divideString (theString) {
   theString = String(theString);
    var a = Number(theString.slice(0, theString.indexOf("\/")));
    var b = Number(theString.slice(theString.indexOf("\/") + 1));
    return (a / b)
    };
// from a script by michael l hale;
function loadXMPLibrary(){
     if ( !ExternalObject.AdobeXMPScript ){
          try{
               ExternalObject.AdobeXMPScript = new ExternalObject
                                                            ('lib:AdobeXMPScript');
          }catch (e){
               alert( ErrStrs.XMPLIB );
               return false;
          }
     }
     return true;
};
function unloadXMPLibrary(){
   if( ExternalObject.AdobeXMPScript ) {
      try{
         ExternalObject.AdobeXMPScript.unload();
         ExternalObject.AdobeXMPScript = undefined;
      }catch (e){
         alert( ErrStrs.XMPLIB );
      }
   }
};
////// based on a script by muppet mark //////
function dimensionsShellScript (file) {
   try {
// getMetaDataMDLS;
if (File(file) instanceof File && File(file).exists) {
   var shellString = "/usr/bin/mdls ";
   shellString += File(file).fsName;
//   shellString += File(file).fullName;
   shellString += ' > ~/Documents/StdOut2.txt';
   app.system(shellString);
   };
// read the file;
if (File('~/Documents/StdOut2.txt').exists == true) {
    var file = File('~/Documents/StdOut2.txt');
    file.open("r");
    file.encoding= 'BINARY';
    var theText = new String;
    for (var m = 0; m < file.length; m ++) {
      theText = theText.concat(file.readch());
      };
   file.close();
   theText = theText.split("\n");
   };
// get the dimensions;
   var dim = new Array;
   for (var m = 0; m < theText.length; m++) {
      var theLine = theText[m];
      if (theLine.indexOf("kMDItemPixelWidth") != -1) {dim.push(theLine.match(/[\d\.]+/g).join("") )}
      if (theLine.indexOf("kMDItemPixelHeight") != -1) {dim.push(theLine.match(/[\d\.]+/g).join("") )}
      if (theLine.indexOf("kMDItemResolutionWidthDPI") != -1) {dim.push(theLine.match(/[\d\.]+/g).join("") )}
      if (theLine.indexOf("kMDItemResolutionHeightDPI") != -1) {dim.push(theLine.match(/[\d\.]+/g).join("") )}
      };
// remove file and hand back;
   File('~/Documents/StdOut2.txt').remove();
   }
catch (e) {
   if (File('~/Documents/StdOut2.txt').exists == true) {File('~/Documents/StdOut2.txt').remove()};
   };
   return dim
   };
////////////////////////////////////
   try{
      loadXMPLibrary();
      var xmpf = new XMPFile( file.fsName, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_READ );
      var xmp = xmpf.getXMP();
      xmpf.closeFile();
      
      var resolutionUnit = xmp.getProperty( XMPConst.NS_TIFF, 'ResolutionUnit', XMPConst.STRING);
      var resFactor = 1;
      if (resolutionUnit == 2) {
         var resFactor = 1;
         };
      if (resolutionUnit == 3) {
         var resFactor = 2.54;
         };
      
      var dim = [xmp.getProperty( XMPConst.NS_EXIF, 'PixelXDimension', XMPConst.STRING),
      xmp.getProperty( XMPConst.NS_EXIF, 'PixelYDimension', XMPConst.STRING),
      divideString (xmp.getProperty( XMPConst.NS_TIFF, 'XResolution', XMPConst.STRING)) * resFactor,
      divideString (xmp.getProperty( XMPConst.NS_TIFF, 'YResolution', XMPConst.STRING)) * resFactor];
      unloadXMPLibrary();
      if(dim[0]=="undefined" || dim[1]=="undefined"){
            var dim = undefined;
            var res = undefined;
            var bt = new BridgeTalk;
            bt.target = "bridge";
            var myScript = ("var ftn = " + psRemote.toSource() + "; ftn("+file.toSource()+");");
            bt.body = myScript;
            bt.onResult = function( inBT ) {myReturnValue(inBT.body); }
            bt.send(10);
     
      function myReturnValue(str){
         res = str;
         dim = str.split(',');
         };

      function psRemote(file){
         var t= new Thumbnail(file);
         return t.core.quickMetadata.width+','+t.core.quickMetadata.height;
         };
        }
    }catch(e){unloadXMPLibrary()};
////////////////////////////////////
   if (String(dim[2]).indexOf("\/") != -1) {
      var a = divideString(dim[2]);
      var b = divideString(dim[3]);
      dim = [dim[0], dim[1], a, b]
      };
// if dimensions are missing as might be the case with some bitmap tiffs for example try a shell-script;
   if (dim[0] == undefined || dim[1] == undefined) {
      var array = dimensionsShellScript(file);
      dim = array;
      };
// if shell-string failed open doc to get measurements;
   if (dim[0] == undefined || dim[1] == undefined) {
      var thisDoc = app.open (File(file));
// close ai without saving;
      if (file.name.slice(-3).match(/\.(ai)$/i)) {
         thisDoc.trim(TrimType.TRANSPARENT);
         var dim = [thisDoc.width, thisDoc.height, thisDoc.resolution, thisDoc.resolution];
         thisDoc.close(SaveOptions.DONOTSAVECHANGES)
         }
      else {
         var dim = [thisDoc.width, thisDoc.height, thisDoc.resolution, thisDoc.resolution];
         thisDoc.close(SaveOptions.PROMPTTOSAVECHANGES)
         }
      };
////////////////////////////////////
return dim;
};

pfaffenbichler

script for arrangement of images

Postby pfaffenbichler » Mon Mar 14, 2011 10:30 am

Have found a source of mistakes already … as Placing is done relative to the screen-display I need to insert a »Fit on Screen«.

csuebele

script for arrangement of images

Postby csuebele » Wed Jun 15, 2011 2:51 am

Tried to run the script, but it would not go past getting the files. The dialog box came up, but I no files showed, so I could not select them.

As far as placing images, I've done a few contact sheet scripts and what I do is place the image then get the bounds of there the image is and then move it into place. This gets around PS placing an image relative to the screen.


Return to “Photoshop Scripts: Beta Testing”

Who is online

Users browsing this forum: No registered users and 2 guests