Add Functions to Image Processor

Can someone assist me or point me in the right direction, to information on how to add functions to the default Photoshop Image Processor script. I do not know javascript but can follow along fairly well if someone has good sirections.
What I need to add,
Renaming files like PSE's 'Process Multiple Files' feature, output as .png in adition to jpg, psd and tiff.
I would basically like to bring PSE's multiple image processor into Photoshop.
I found the image processor script, but dont know java. If someone could assist with this I would appreciate it.
I have attached an image of what I need from PSE. The default image processor in PS CS4 almost does it, but a couple of areas are lacking.
Any info, greatly appreciated.

I don’t want to sound condescending, especially as I also have often had to to rely on some of this forum’s contributor’s help myself, but maybe You should start with working through »Adobe Intro To Scripting.pdf« and then read up on »User-Interface Tools« in »JavaScript Tools Guide CS4.pdf«.
Both pdfs should be located in Your ExtendScript Toolkit-folder (ESTK is installed with Photoshop CS4).
Starting Photoshop-Scripting with adapting a Script as voluminous as »Image Processor.jsx« might be a bit of a challenge.

Similar Messages

  • Image Processor bug causes PS to crash (CS5, 12.0.4, Win7x64) -

    Hi,
    I'm trying to process 64 RAW files using Image Processor, and I noticed that Photoshop (x64, I don't have the 32-bit version installed) never closes any of the files after it has processed them. This causes the RAM to fill, and eventually Photoshop to crash. I tried both via Bridge (Tools --> Photoshop --> Image Processor), and Photoshop itself. I have a new system with 8GB RAM, and when I start up Image Processor, Task Manager tells me PS eats away 6.5-7GB of it during the first minute. Shortly after PS crashes.
    My updates are up-to-date according to the update manager. I haven't had this problem ever before, so the cause must be the 12.0.4 update (or the one before it). Is there a workaround or an update on the way? Maybe this is a known bug. I found out that people have experienced the same behaviour with CS4.
    Kind regards,
    Kimmo

    Sorry for the delay in response; the Adobe server for logging in was down for hours.
    The reason I'm on the latest drivers is that I made a clean install of Windows 7 a couple of days back.
    Regarding the Intel driver I mentioned I downloaded: I had to go another route; the Intel driver "was not validated for this system", so I had to get the latest driver from the manufacturer of the computer -- which kind of sucks, to be honest. Well, anyways, the driver version from the manufacturer is the same I had from Windows Update (i.e. not the latest possible), but I went and installed it anyway -- thinking that maybe it's been "customized" somehow...
    Unfortunately it brought no change. Action B still accumulates files while others do not.
    I should clarify that the reason why the "Wood Frame" kept accumulating files in the PS main window was that it never finished the process. I tried it to run on pictures that were larger than what it was designed for and thus it stopped mid-process and left the window open.
    (BTW: I'm talking about windows and tabs interchangeably here)
    "Action B", as I've called it in this thread, does generate a final, processed JPEG, but apparently it doesn't return a confirmation of it finishing to the Image Processor. Without Image Processor knowing that the script finished successfully it leaves the file open.
    I see that in File --> Automate --> Batch it is possible to have the process "Save and Close" each file it processes. Maybe it would be beneficial to have a similar function for Image Processor. And not only "just in case" -- the user might actually want to leave all the files open, who knows, but in situations like these a forced closing of a file -- be it finished or not -- would be nice.
    I would also like to point out to other people reading this thread that, while this problem can be fixed by simply remaking the troublesome action, I feel finding the cause for it would benefit a lot of people too. Maybe the action was corrupted somehow, maybe PS 12.0.4. has a bug that makes my "Action B" from 11/2011 incompatible -- would be nice to know, huh?

  • Photoshop Cs 4 Image Processor

    Unable to use image processor feature in CS 4. Error message indicates "Cannot find javascript plug-in. This feature was working just fine until a few weeks ago. Nothing unusual has changed. Thanks

    the folder must have moved or something...
    here it is for now copy it to ... applications/adobe photoshop cs4/presets/scripts : and it will be a good time to see if that folder is even there.
    Regards
    G
    // (c) Copyright 2006-2007.  Adobe Systems, Incorporated.  All rights reserved.
    // Photomerge in ExtendScript.
    // Translated from the original C++ automation & filter plugins
    // John Peterson, Adobe Systems, 2006
    // Adobe Patent or Adobe Patent Pending Invention Included Within this File
    @@@BUILDINFO@@@ Photomerge.jsx 3.0.0.1
    // BEGIN__HARVEST_EXCEPTION_ZSTRING
    <javascriptresource>
    <name>$$$/JavaScripts/Photomerge/Menu=Photomerge...</name>
    <about>$$$/JavaScripts/Photomerge/About=Photomerge^r^rCopyright 2006-2008 Adobe Systems Incorporated. All rights reserved.^r^rCombines several photographs into one continuous image.</about>
    <menu>automate</menu>
    </javascriptresource>
    // END__HARVEST_EXCEPTION_ZSTRING
    // on localized builds we pull the $$$/Strings from a .dat file
    $.localize = true;
    // Put header files in a "Stack Scripts Only" folder.  The "...Only" tells
    // PS not to place it in the menu.  For that reason, we do -not- localize that
    // portion of the folder name.
    var g_StackScriptFolderPath = app.path + "/"+ localize("$$$/ScriptingSupport/InstalledScripts=Presets/Scripts") + "/"
                                            + localize("$$$/Private/Exposuremerge/StackScriptOnly=Stack Scripts Only/");
    $.evalFile(g_StackScriptFolderPath + "LatteUI.jsx");
    $.evalFile(g_StackScriptFolderPath + "StackSupport.jsx");
    $.evalFile(g_StackScriptFolderPath + "CreateImageStack.jsx");
    $.evalFile(g_StackScriptFolderPath + "Geometry.jsx");
    $.evalFile(g_StackScriptFolderPath + "PolyClip.jsx");
    // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
    // Must leave at zero, otherwise trapping gFileFromBridge fails on QA's debug builds.
    $.level = 0; // (Window.version.search("d") != -1) ? 1 : 0;
    // debugger; // launch debugger on next line
    if (typeof(PMDebug) == 'undefined')
        var PMDebug = false;
    // photomerge routines
    // Debug - write the trapezoid in Matlab format
    function dumpTrap( name, corners )
        var i;
        if (! PMDebug) return;
        $.write( name + "= [" );
        for (i in corners)
            $.write( ((i > 0) ? "; " : "" ) + corners[i].fX + " " + corners[i].fY );
        $.writeln( "];");
    StackElement.prototype.dumpMLCorners = function()
        // Weed out file suffix (chokes matlab)
        dumpTrap( this.fName.match(/([^.]+)/)[1], this.fCorners );
    // Set the fCorners of the layer to the bounds of the Photoshop layer.
    StackElement.prototype.setCornersToLayerBounds = function( stackDoc )
        if (typeof(stackDoc) == "undefined")
            stackDoc = app.activeDocument;
        var bounds = stackDoc.layers[this.fName].bounds;
        this.fCorners = new Array();
        this.fCorners[0] = new TPoint( bounds[0].as("px"), bounds[1].as("px") );
        this.fCorners[2] = new TPoint( bounds[2].as("px"), bounds[3].as("px") );
        this.fCorners[1] = new TPoint( this.fCorners[2].fX, this.fCorners[0].fY );
        this.fCorners[3] = new TPoint( this.fCorners[0].fX, this.fCorners[2].fY );
    // Add the corner data to the string of per-stackElement information
    // that gets passed to the filter plugin
    StackElement.prototype.addPieceData = function()
        if (typeof(this.fCorners) != "undefined")
            // Add corners in place of trailing '\n'
            this.fString = this.fString.slice(0,-1) + "fCorners=";
            for (j = 0; j < 4; j++)
                this.fString += " " + this.fCorners[j].fX.toString() + " " + this.fCorners[j].fY.toString();
            this.fString += "\t";
            if (typeof(this.fScale) != "undefined")
                this.fString += ("fScale=" + this.fScale.toString() + "\t");
            if ((typeof(this.fConnectedTo) != "undefined") && this.fConnectedTo)
                this.fString += "fConnectedTo=" + this.fConnectedTo.fLayerID + "\t";
            if (typeof(this.fLayerID) != "undefined")
                this.fString += "fLayerID=" + this.fLayerID.toString() + "\t";
            this.fString += "\n";
        else
            debugger;    // Corner data missing!
    StackElement.prototype.overlapArea = function( other )
        if (other == this)
            return TPoint.polygonArea( this.fCorners );
        var overlapBounds = TRect.intersection( this.fBoundsCache, other.fBoundsCache );
        if (overlapBounds.isEmpty())
            return 0.0;
        var clipPoly = TPoint.intersectConvexPolygons( this.fCorners, other.fCorners );
        if (! clipPoly)
            return 0.0;
        else return TPoint.polygonArea( clipPoly );
    // Find the points where the two quadrilaterals intersect (yes, eight is a theoretical max)
    // Note situations where one piece intersects the same edge twice - special
    // case handled by SoftEdgeBlend
    StackElement.prototype.findQuadIntersections = function( other, intersections )
        var i, j;
        var curIntersections, numIntersections = 0;
        var innerEdgeIntersections = [ 0, 0, 0, 0 ];
        var outerEdgeIntersections = [ 0, 0, 0, 0 ];
        var thisEdge = false;
        var otherEdge = false;
        for (i = 0; i < 4; i++)
            var eb0 = other.fCorners[i];
            var eb1 = other.fCorners[(i + 1) > 3 ? 0 : i + 1];
            curIntersections = numIntersections;
            for (j = 0; j < 4; j++)
                var ed0 = this.fCorners[j];
                var ed1 = this.fCorners[(j + 1) > 3 ? 0 : j + 1];
                var cross = TPoint.lineSegmentIntersect( eb0, eb1, ed0, ed1 );
                if (cross != TPoint.kInfinite)
                    intersections[numIntersections++] = cross;
                    innerEdgeIntersections[j]++;
            outerEdgeIntersections[i] = numIntersections - curIntersections;
        if (numIntersections == 2)
            for (i = 0; i < 4; i++)
                if (innerEdgeIntersections[i] == 2) thisEdge = true;
                if (outerEdgeIntersections[i] == 2) otherEdge = true;
        return {"numIntersections":numIntersections, "thisEdge":thisEdge, "otherEdge":otherEdge};
    // Look for a point of this that's inside the corners of other.
    StackElement.prototype.findSingleInsidePoint = function( other )
        var i;
        var result = new Object();
        result.numFound = 0;
        for (i = 0; i < 4; i++)
            if (this.fCorners[i].pointInQuad( other.fCorners ))
                result.numFound++;
                result.insidePt = this.fCorners[i];
        return result;
    // "Adobe patent application tracking # B349, entitled 'Method and apparatus for Layer-based Panorama Adjustment and Editing', inventor: John Peterson"
    // Because we're dealing with quads, we can't use the simple scheme
    // to generate blend rects that the rectangles use - black stuff
    // from the rects will seep in. So instead, we use various heuristics to
    // figure out how the quads themselves intersect.  This isn't too hard
    // when there's just two intersection points (usual case), but there are
    // some pathological cases where there are many more intersections (the octogon
    // from one square 45 deg. off from another is the classic example).          
    StackElement.prototype.softEdgeBlend = function( other, blendRad )
        var i, j;
        var intersections = new Array();    // Worst case is a square inside a 45 degree rot square
        // If there's no distortion, do the blend strictly on the rectangles
    /*    if ((!IsQuadMapped() && !other->IsQuadMapped())
            || (IsRectilinear() && other->IsRectilinear()))
            Assert_( other->fWarpedRaster );
            fWarpedRaster->SoftEdgeBlendRasters( *(other->fWarpedRaster), blendRad );
            return;
        var bounds = this.getBounds();
        // Find the points where the two quadrilaterals intersect
        var intResult = this.findQuadIntersections( other, intersections );
        var numIntersections = intResult.numIntersections;
        var thisEdgeTwice = intResult.thisEdge;
        var otherEdgeTwice = intResult.otherEdge;
        var thisInsidePt = this.findSingleInsidePoint( other );
        var otherInsidePt = other.findSingleInsidePoint( this );
        // If quads don't overlap, just bail
        if (numIntersections == 0)
            return;
        // Handle cases where just one point overlaps the other piece
        var insidePoint;
        if (otherEdgeTwice || ((numIntersections == 2) && (thisInsidePt.numFound == 1)))
            insidePoint = thisInsidePt.insidePt;
            this.makeBlendTrapezoid( intersections[0], intersections[1], insidePoint, blendRad, false );
            return;
        if (thisEdgeTwice /*|| ((numIntersections == 2) && (otherInsidePt.numFound == 1))*/)
            insidePoint = otherInsidePt.insidePt;
            this.makeBlendTrapezoid( intersections[0], intersections[1], insidePoint, blendRad, false );
            return;
        // ...More than two corners overlap, apply heuristics to find reasonable blending
        $.bp( numIntersections > 8 );
        // If we got more than two points, pick the two furthest apart
        if (numIntersections > 2)
            var max0, max1;
            var maxDist = -1.0;
            for (i = 0; i < numIntersections - 1; i++)
                for (j = i + 1; j < numIntersections; j++)
                    var dist = (intersections[i] - intersections[j]).vectorLength();
                    if (dist > maxDist)
                        max0 = intersections[i];
                        max1 = intersections[j];
                        maxDist = dist;
            $.bp( maxDist <= -1.0 );
            intersections[0] = max0;
            intersections[1] = max1;
            numIntersections = 2;
        TPoint.clipLineToRect( bounds, intersections[0], intersections[1] );
        // The point furthest away from the cut line on the "other" image
        // is the one that we blend toward (the "dark" corner).
        var maxPoint = 0, maxDist = -1;
        for (i = 0; i < 4; i++)
            var dist = Math.abs( other.fCorners[i].distanceToLine( intersections[0], intersections[1] ) );
            if (dist > maxDist)
                maxDist = dist;
                maxPoint = i;
        this.makeBlendTrapezoid( intersections[0], intersections[1], other.fCorners[maxPoint], blendRad, true );
    // "Adobe patent application tracking # B349, entitled 'Method and apparatus for Layer-based Panorama Adjustment and Editing', inventor: John Peterson"
    // Create a layer mask that fades out from the edge0,edge1 cutline towards "insidePt"
    // If two points are inside, construct the mask fade from the edge of the image.
    //                       insidePt
    //             |            *           |
    //             |           / \          |
    //             |          /   \         |
    // insetLine-> |       +-/-----\-+      |  --
    //             |       |/       \|      |   | radius
    // baseLine->  +-------*---------*------+  --
    //                    /edge0      \edge1
    StackElement.prototype.makeBlendTrapezoid = function( edge0, edge1, insidePt, radius, useCorners )
        function sgn(x) { if (x < 0) return -1; if (x > 0) return 1; return 0; }
        function wrap4(i, next)
            i += next;
            if (i > 3) return i % 4;
            if (i < 0) return 3;
            return i;
        // Create a layer mask
        selectOneLayer( app.activeDocument, this.fName );
    //    app.activeDocument.activeLayer = app.activeDocument.layers[this.fName];    // Broken if multiple layers selected.
        createLayerMask();    // Does nothing if the layer already has a mask
        // Create vector perpendicular to edge towards insidePt
        var edgeDir = edge1 - edge0;
        var blendDir = new TPoint( -edgeDir.fY, edgeDir.fX );
        blendDir /= blendDir.vectorLength();    // Make unit length
        // Make a polygonal selection covering the area
        var dist = insidePt.distanceToLine( edge0, edge1 );
        var blendOffset = blendDir * dist;
        var blendBox;
        if (! useCorners)
            blendBox = [edge0, edge0+blendOffset, edge1+blendOffset, edge1, edge0];
        else
            // If the cutline slices across the image (two points on each side), then
            //        - Look for the edge edge0 is on
            //        - Figure out which corner is on the same side as "insdePt"
            //        - Construct the blendBox from that.
            var i, nextPtInd;
            for (i = 0; i < 4; i++)
                if (edge0.distanceToLine( this.fCorners[i], this.fCorners[wrap4(i,1)] ) < 0.0001 )
                    if (this.fCorners[i].sideOf( edge0, edge1 ) == sgn( dist ))
                        nextPtInd = -1;
                    else
                        nextPtInd = 1;
                    blendBox = new Array();
                    blendBox[0] = edge0;
                    blendBox[1] = (nextPtInd < 0) ? this.fCorners[i] : this.fCorners[i+1];
                    blendBox[2] = (nextPtInd < 0) ? this.fCorners[wrap4(i, -1)] : this.fCorners[wrap4(i, 2)];
                    blendBox[3] = edge1;
                    break;
            $.bp( i == 4 );    // Never found edge0?
        createPolygonSelection( blendBox );
        // Fill it.
        var midPoint = (edge0 + edge1) * 0.5;
        gradientFillLayerMask( midPoint, midPoint + blendDir * radius * sgn(dist) );
        app.activeDocument.selection.deselect();
    // Photomerge base class
    const kPhotomergeAdvancedBlendingFlag = app.stringIDToTypeID( "PhotomergeAdvancedBlendingFlag" );  
    photomerge = new ImageStackCreator( localize("$$$/AdobePlugin/Shared/Photomerge/Process/Name=Photomerge"),
                                              localize('$$$/AdobePlugin/Shared/Photomerge/Auto/untitled=Untitled_Panorama' ), null );
    // For now, alignment is turned OFF, because we want to
    // invoke it independantly.             
    photomerge.useAlignment            = false;    // We do the alignment, not PS
    photomerge.hideAlignment        = true;
    photomerge.mustBeSameSize        = false;
    photomerge.mustBeUnmodifiedRaw = false;
    photomerge.mustNotBe32Bit        = ! app.featureEnabled(localize("$$$/private/32BitLayersFeature=32-Bit Layers"));
    photomerge.radioButtons = ["_LOauto", "_LOperspective", "_LOcylindrical", "_LOspherical", "_LOcollage", "_LOnormal", "_LOinteractive"];
    photomerge.interactiveFlag        = false;
    photomerge.alignmentKey            = "Auto";    // Defaults to perspective
    photomerge.compositionFile        = null;
    photomerge.advancedBlending        = true;
    photomerge.lensCorrection        = false;
    photomerge.removeVignette        = false;
    try {
    // We want to steer people to the advanced blending option,
    // so have it be on by default, rather than sticky.
    //    var desc = app.getCustomOptions("PhotomergeFlags001");
    //    photomerge.advancedBlending = desc.getBoolean( kPhotomergeAdvancedBlendingFlag );
    catch (e)
    // Get the bounds of all of the stackElements.
    photomerge.getBounds = function()
        var i;
        for (i in this.stackElements)
            if (i == 0)
                this.fBounds = this.stackElements[i].getBounds();
            else
                this.fBounds.extendTo( this.stackElements[i].getBounds() );
        return this.fBounds;
    // Align selected layers by content (uses SIFT registration in Photoshop core)
    // This just returns the alignment data, it does not actually transform the layers
    // unless doTransform is true
    photomerge.getAlignmentInfo = function( stackDoc, doTransform )
        selectAllLayers(stackDoc, 1);
        const kMargin = 10;
        function offsetGroup( delta, group )
            group.bounds.offset( delta );
            var k;
            for (k = 0; k < group.layers.length; ++k)
                group.layers[k].offset( delta );
                if (doTransform)
                    selectOneLayer( stackDoc, group.layers[k].fName );
                    // Translate gets broken when document DPI isn't 72 DPI...(PR 1417264)
    //                activeDocument.activeLayer.translate( UnitValue( delta.fX, "px" ), UnitValue( delta.fY, "px" ) );   
                    translateActiveLayer( delta.fX, delta.fY );
        var i, j, alignInfo;
        var alignmentFlags = [];
        if (this.lensCorrection) alignmentFlags.push(kradialDistortStr);
        if (this.removeVignette) alignmentFlags.push(kvignetteStr);
        alignInfo = getActiveDocAlignmentInfo( this.alignmentKey, doTransform, alignmentFlags );
        // If the alignment fails completely, fake up a plan B...
        // For now, just set the images side by side.
        if (! alignInfo)
            alert(localize("$$$/AdobePlugin/Shared/Photomerge/alignbad=Some images could not be automatically aligned"));
            var xpos = 0;
            for (i in this.stackElements)
                this.stackElements[i].setCornersToSize();
                this.stackElements[i].offset( new TPoint( xpos, 0 ) );
                xpos += this.stackElements[i].getBounds().getWidth() + kMargin;
            this.fGroups = null;
        else
            var layerList = alignInfo.layerInfo;
            this.fGroups = new Array();
            for (i = 0; i < layerList.length; ++i)
                // Note we depend on stackElement's order matching
                // the document's sheet list!
                var curGroup = layerList[i].groupNum;
                if (!doTransform && (layerList[i].corners.length > 0))
                    this.stackElements[i].fCorners = layerList[i].corners;
                else
                    this.stackElements[i].setCornersToLayerBounds( stackDoc );
                this.stackElements[i].fAlignGroup = curGroup;
                this.stackElements[i].fBaseFlag = layerList[i].baseFlag;
                if (typeof(this.fGroups[curGroup]) == "undefined")
                    this.fGroups[curGroup] = new Object();
                    this.fGroups[curGroup].hasCorners = layerList[i].corners.length > 0;
                    this.fGroups[curGroup].bounds = this.stackElements[i].getBounds();
                    this.fGroups[curGroup].layers = new Array();
                    this.fGroups[curGroup].xformType = layerList[i].xformType;
                else
                    this.fGroups[curGroup].bounds.extendTo( this.stackElements[i].getBounds() );
                this.fGroups[curGroup].layers.push( this.stackElements[i] );
            // Now move the groups into  place
            // Note carefully: if the corners were given, then the group is already
            // transformed into the proper spot, and we just need to move the corners to
            // match.  So shut off moving the layer pixels around from here on out.
            offsetGroup( -this.fGroups[0].bounds.getTopLeft(), this.fGroups[0] );
            for (i = 1; i < alignInfo.numGroups; ++i)
                var spacing = Math.round(this.fGroups[i-1].bounds.getHeight() / 10.0);
                offsetGroup( -this.fGroups[i].bounds.getTopLeft() + new TPoint(0, spacing + Math.round(this.fGroups[i-1].bounds.fBottom)),
                               this.fGroups[i] );
        this.getBounds();
    // The original Photomerge plugin needs to have the "connectivity" of the
    // pieces when in perspective mode, i.e., a pieces distortion is based
    // on the distortion of the one it overlaps most.  This takes the
    // "base" piece information from the PS core and uses overlap area to
    // determine this.
    photomerge.setupConnectivity = function()
        var i;
        // See if stackElem is connected to the "base".  If "without"
        // is given, then the path to the base must not use "without"
        function isConnectedToBase( stackElem, without, dbg_count )
            if (typeof(dbg_count) == "undefined")
                dbg_count = 0;
            if (typeof(without) == "undefined")
                without = null;
            $.bp( dbg_count > 150 );    // oops, got stuck in a loop...
            if (stackElem == null)
                return false;
            if (stackElem == without)
                return false;
            if (stackElem.fConnectedTo == stackElem)
                return true;        // Already at base
            return isConnectedToBase( stackElem.fConnectedTo, without, dbg_count + 1 );
        // Initialize
        for (i in this.stackElements)
            this.stackElements[i].fBoundsCache = this.stackElements[i].getBounds();
            this.stackElements[i].fLayerID = i;
            // Bases connect to themselves.
            this.stackElements[i].fConnectedTo = this.stackElements[i].fBaseFlag ? this.stackElements[i] : null;
            this.stackElements[i].fNeighborOverlap = 0;
        // Create a connection table based on the overlap of the pieces
        var g, i, j, baseInd = -1;
        if (this.fGroups)
            for (g in this.fGroups)
                var group = this.fGroups[g];
                var connections = new Array();
                var numLayers = group.layers.length;
                // Ignore orphan images
                if (numLayers < 2)
                    group.layers[0].fBaseFlag = false;
                    group.layers[0].fConnectedTo = null;
                    continue;
                // If there's no perspective, there's no connections ("0" is kProjective in UAlignment.h)
                if (group.xformType != 0)
                    for (i = 0; i < numLayers; ++i)
                        group.layers[i].fBaseFlag = false;
                        group.layers[i].fConnectedTo = group.layers[i];
                    continue;
                for (i = 0; i < numLayers; ++i)
                    if (group.layers[i].fBaseFlag)
                        baseInd = i;
                    connections[i] = new Array();
                    group.layers[i].fGroupIndex = i;
                    if (i > 0)
                        for (j = 0; j < i; ++j)
                            connections[i][j] = group.layers[i].overlapArea( group.layers[j] );
                            connections[j][i] = connections[i][j];    // table is symentric
                $.bp( baseInd == -1 );    // Never found the base?
                // Debug - dump the connection table
        /*        for (i = 0; i < numLayers; ++i)
                    var s = "";
                    for (j = 0; j < numLayers; ++j)
                        s += ", " + Math.floor(connections[i][j]);
                    $.writeln(s);
                // Connect everything to the base that's connected.
                for (i = 0; i < numLayers; ++i)
                    if ((i != baseInd) && (connections[baseInd][i] > 0))
                        group.layers[i].fConnectedTo = group.layers[baseInd];
                        group.layers[i].fNeighborOverlap = connections[baseInd][i];
                // Walk the cconnectivity table and make sure everything is
                // "optimally" connected.
                var changes = false;
                do {
                    changes = false;
                    for (i = 0; i < numLayers; ++i)
                        if (i != baseInd)
                            var curLayer = group.layers[i];
                            for (j = 0; j < numLayers; ++j)
                                if (((j != baseInd) && (j != i))
                                    && (((connections[i][j] > curLayer.fNeighborOverlap)
                                            && isConnectedToBase( group.layers[j], curLayer ))))
                                    curLayer.fConnectedTo = group.layers[j];
                                    curLayer.fNeighborOverlap = connections[i][j];
                                    changes = true;
                } while (changes);
        //        for (i = 0; i < numLayers; ++i)
        //            $.writeln( group.layers[i].fName + " is connected to " + (group.layers[i].fConnectedTo ? group.layers[i].fConnectedTo.fName : "??") );
    photomerge.offsetStack = function( delta )
        for (i in this.stackElements)
            this.stackElements[i].offset( delta );
        this.fBounds.offset( delta );
    photomerge.scaleStack = function( s )
        for (i in this.stackElements)
            this.stackElements[i].scale( s );
        this.getBounds();
    // This gets executed before a filter plugin is invoked.  "desc"
    // allows passing parameters to the filter.
    photomerge.customPluginArguments = function( desc )
        var f = new File(this.stackElements[0].fFullName);
        var path = File.encode( f.parent.fsName ) + (File.fs == "Windows" ? "\\" : "/");
        desc.putString( app.charIDToTypeID('PMfp'), path );
        if (this.compositionFile)
            desc.putString( app.charIDToTypeID('PMrf'), this.compositionFile.fsName );
            desc.putString( app.charIDToTypeID('PMcf'), File.encode( this.compositionFile.fsName ) );
    photomerge.callInteractivePlugin = function( stackDoc )
        // Scale the results to fit the screen
    /*        var scaleFactor = 1.0, screenSize = primaryScreenDimensions() * 0.75;
        if (this.fBounds.getHeight() > this.fBounds.getWidth())
            if (this.fBounds.getHeight() > screenSize.fY)
                scaleFactor = screenSize.fY / this.fBounds.getHeight();
        else
            if (this.fBounds.getWidth() > screenSize.fX)
                scaleFactor = screenSize.fX / this.fBounds.getWidth();
        const kMaxPieceSize = 1024;        // Must match value in PhotomergeUI.cpp
        var i;
        // The old plugin insists on eight bit data.
        if (stackDoc.bitsPerChannel != BitsPerChannelType.EIGHT)
            stackDoc.bitsPerChannel = BitsPerChannelType.EIGHT;
            this.stackDepthChanged = true;
        if (this.compositionFile == null)
            // Make sure the quad coordinates coorespond to the scale used by the UI plugin
            var maxPieceSize = 0;
            for (i in this.stackElements)
                maxPieceSize = Math.max( Math.max( this.stackElements[i].fWidth, this.stackElements[i].fHeight ), maxPieceSize );
            var mipLevel = 0;
            while (maxPieceSize >> mipLevel > kMaxPieceSize)
                mipLevel++;
            var imageReduction = 1.0 / (1 << mipLevel);
            this.offsetStack( -this.fBounds.getCenter() );
            this.scaleStack( imageReduction );
            this.offsetStack( -this.fBounds.getTopLeft() );
            this.setupConnectivity();
            // Add the additional per-piece metadata to pass to the filter plugin
            for (i in this.stackElements)
                this.stackElements[i].addPieceData();
        // Make the result layer active
        app.activeDocument.activeLayer = app.activeDocument.layers[app.activeDocument.layers.length -1];
        // Note: we need an "unmodified" flag, so if no
        // changes are made we skip the data recovery step...
        var result, err;
        try {
            result = this.invokeFilterPlugin( "AdobePhotomergeUI4SCRIPT", DialogModes.ALL );
        catch (err)
            result = null;
        if (result == null)        // Cancelled / bombed out
            stackDoc.close(SaveOptions.DONOTSAVECHANGES);
            return null;
        // Extract the data from the plugin
        var modifiedPieceInfo = result.getString( app.charIDToTypeID('PSpc') ).split('\n');
        for (i in modifiedPieceInfo)
            // If we loaded a composition (.pmg) file, we won't have corners yet.
            if (typeof(this.stackElements[i].fCorners) == "undefined")
                this.stackElements[i].fCorners = new Array();
            var j, pieceData = modifiedPieceInfo[i].split('\t');
            for (j in pieceData)
                var k, pair = pieceData[j].split('=');
                if (pair[0] == 'fUsed')
                    this.stackElements[i].fUsed = eval(pair[1]);
                if (pair[0] == 'fCorners')
                    var coords = pair[1].split(/\s+/).slice(1);
                    for (k = 0; k < 4; k++)
                        this.stackElements[i].fCorners[k] = new TPoint( Number(coords[k*2]), Number(coords[k*2+1]) );
        // Remove unused photos
        for (i = 0; i < this.stackElements.length; ++i)
            if (! this.stackElements[i].fUsed)
                stackDoc.layers[(this.stackElements.length-1)-i].remove();
                this.stackElements.splice(i,1);
                i--;
        // Hey...it could happen.
        if (this.stackElements.length < 2)
            return null;
        // If we run the UI, we're restricted to an eight bit stack.
        // If the source images were higher, we need to reload the image stack.
        if (this.stackDepthChanged)
            stackDoc.close(SaveOptions.DONOTSAVECHANGES);
            stackDoc = this.loadStackLayers();
        this.getBounds();        // Update w/new corner data
        return stackDoc;
    // "Adobe patent application tracking # B349, entitled 'Method and apparatus for Layer-based Panorama Adjustment and Editing', inventor: John Peterson"
    // Use the geometry of the overlapping pieces to create
    // simple rectangular blend masks.
    photomerge.quickBlend = function()
        var i, j;
        var blendRadius = Math.round(Math.min(this.stackElements[0].fWidth, this.stackElements[0].fHeight) / 10.0);
        if (PMDebug)
            for (i in this.stackElements)
                this.stackElements[i].dumpMLCorners();
        // Set up progress bar for blending
        // The progress bar doesn't work - there's know way in ScriptUI to force it to update.
    /*    var progressWindow = latteUI( g_StackScriptFolderPath + "PMBlendingProgress.exv" );
        var num = this.stackElements.length;
        var progressBar = progressWindow.findControl('_progress');
        progressBar.maxvalue = (num * (num + 1)) / 2;
        num = 0;
        progressWindow.center();
        progressWindow.show();
        // Blend the i'th piece against the 0..i-1 pieces below it
        for (i = this.stackElements.length-1; i > 0; --i)
            for (j = i-1; j >= 0; j--)
    //            num++;
    //            progressBar.value = num; // ScriptUI bug - there's no way to force this to update.
                this.stackElements[i].softEdgeBlend( this.stackElements[j], blendRadius );
    //    progressWindow.close();
    // Wrap the advancedBlend in a try/catch so errors (i.e., user cancel)
    // just stop the blend process.
    photomerge.advancedBlend = function( stackDoc )
        try {
            selectAllLayers(stackDoc, 1);
            advancedMergeLayers();
        catch (err)
    // With the stack elements specified, this
    // portion actually creates the Panorama.
    // Returns boolean indicating success/failure
    photomerge.doPanorama = function()
        var i, stackDoc = null;
        function primaryScreenDimensions()
            var i;
            for (i in $.screens)
                if ($.screens[i].primary)
                    return new TPoint( $.screens[i].right - $.screens[i].left,
                                          $.screens[i].bottom - $.screens[i].top );
        function resizeCanvasToFitPano()
            // Extend the canvas to hold the panorama
            var w = UnitValue( photomerge.getBounds().getWidth(), "px" );
            var h = UnitValue( photomerge.getBounds().getHeight(), "px" );
            app.activeDocument.resizeCanvas( w, h, AnchorPosition.TOPLEFT );
        if (this.interactiveFlag)
            // Filter must have eight bit depth and RGB color space
            stackDoc = this.loadStackLayers( BitsPerChannelType.EIGHT );
            stackDoc.changeMode(ChangeMode.RGB);
        else
            stackDoc = this.loadStackLayers();
        if (! stackDoc)
            return false;
        // Remove spurious last layer (not needed by Photomerge)
        if (app.activeDocument.layers[app.activeDocument.layers.length-1].name == this.pluginName)
            app.activeDocument.layers[app.activeDocument.layers.length-1].remove();
        // The UI needs everything in the top left corner
        if (this.interactiveFlag)
            for (i = 0; i < stackDoc.layers.length; ++i)
                var xoff = stackDoc.layers[i].bounds[0].as("px");
                var yoff = stackDoc.layers[i].bounds[1].as("px");
                if ((xoff != 0) || (yoff != 0))
                    stackDoc.layers[i].translate( UnitValue( -xoff, "px" ), UnitValue( -yoff, "px" ) );
        // Sort out exactly what operations we want to do.
        if (! this.interactiveFlag)
            selectAllLayers(stackDoc, 1);
            this.getAlignmentInfo( stackDoc, true );
            resizeCanvasToFitPano();
            if (this.advancedBlending)
                stackDoc.changeMode( ChangeMode.RGB );    // Auto-blend requires  RGB
                this.advancedBlend( stackDoc );
    // The Advanced blending works so well that there's little point
    // in having the rectangular gradient blends anymore.  Uncomment the
    // following two lines if you still want them (see similar code below
    // for the interactive case).
    //        else
    //            this.quickBlend();
            purgeHistoryStates();
            return true;
        // Interactive happens here
        if (this.compositionFile == null)
            this.getAlignmentInfo( stackDoc, false );   
            // With the corners computed by getAlignmentInfo,
            // find the bounds and use that to slide the images
            // over so their bounds has origin 0,0 (top left)
            this.offsetStack( -this.fBounds.getTopLeft() );
        if (this.interactiveFlag)
            stackDoc = this.callInteractivePlugin( stackDoc );
        if (stackDoc == null)
            return false;
        resizeCanvasToFitPano();
        // Now apply the transformation to the pieces
        for (i in this.stackElements)
            this.stackElements[i].transform();
        if (this.advancedBlending)
            selectAllLayers( stackDoc, 1 );
            stackDoc.changeMode( ChangeMode.RGB );    // Auto-blend requires  RGB
            advancedMergeLayers();
    // The new "advanced blending" works well enough that there's
    // little point in invoking the rectangular gradient blends anymore.
    // If you really want them, you can uncomment the two lines below.
    //    else
    //        this.quickBlend();
        purgeHistoryStates();
        return true;
    // Extra group breaks the main dialog's radio buttons,
    // so we manually implement it here (ScriptUI lossage)
    // NOTE: When called, this is a member function of radioControl,
    // -not- photomerge.  JavaScript voodoo.
    photomerge.radioClick = function()
        var w = this.window;
        var i;
        // Some of the transforms don't allow lens correction...
        var allowLensCor = ((this.button_id != '_LOnormal')
                            && (this.button_id != '_LOcollage')
                            && (this.button_id != '_LOinteractive'));
        w.findControl('_useLensCorrection').enabled = allowLensCor;
        w.findControl('_removeVignette').enabled = allowLensCor;
        // Be aggressive about it...
        if (! allowLensCor)
            w.findControl('_useLensCorrection').value = false;
            w.findControl('_removeVignette').value = false;
        for (i in photomerge.radioButtons)
            var b = w.findControl(photomerge.radioButtons[i]);
            if (b != this)
                b.value = false;
    // Callback when "Load Composition" is clicked.
    // NOTE: When called, this is a member function of buttonControl,
    // -not- photomerge.  JavaScript voodoo.
    photomerge.loadCompositionClick = function()
        function MacPMGType( f )
            if (f.type == 'PhMg')
                return true;
            var match = f.name.match(/.*[.](.+)$/);
            var suffix = match != null ? match[1].toLowerCase() : "";
            if (suffix == "pmg")
                return true;
            if (f instanceof Folder)
                // If the item is an app or a bundle it will be an
                // instance of folder. If we return true it will
                // appear as an enabled item. While the OS will not
                // let the user navigate into it, it is better to
                // have it appear as disabled.
                if (suffix.match(/app|bundle/i) != null)
                    // Do not navigate folders that end in .app or .bundle
                    return false;
                // navigate any other folder
                return true;
            // some unknown file type/suffix
            return false;
        var fileType = File.fs == "Windows" ? localize("$$$/AdobePlugin/Shared/Photomerge/Auto/Win=Photomerge Compositions:*.pmg")
                                        : MacPMGType;
        photomerge.compositionFile = File.openDialog( localize("$$$/AdobePlugin/Photomerge/LoadComp=Load Photomerge Composition"), fileType );
        if (photomerge.compositionFile == null || !photomerge.compositionFile.open("r"))
            return;
        var line = photomerge.compositionFile.readln();
        if (! line.match(/^VIS/))
            alert( this.pluginName + localize("$$$/AdobePlugin/Photomerge/BadComp=The Composition file is corrupt"), this.pluginName, true );
            return;
        // Read through the composition file and extract the file paths in it.
        var mergeFiles = new Array();
        while (! photomerge.compositionFile.eof)
            line = photomerge.compositionFile.readln();
            var f = line.match(/^\s*PATH\s+<([^>]+)/);
            if (f)
                // If no file path delimiters, image paths are assumed relative to the composition file
                var relPath = (f[1].indexOf( (File.fs == "Windows") ? "\\" : "/" ) < 0);
                f = (relPath ? photomerge.compositionFile.path + "/" : "") + f[1];
                mergeFiles.push( new StackElement( new File(f) ) );
        if (mergeFiles.length < 2)
            alert( this.pluginName + localize("$$$/AdobePlugin/Photomerge/BadComp=The Composition file is corrupt"), this.pluginName, true );
            return;
        photomerge.stackElements = mergeFiles;
        photomerge.interactiveFlag = true;
        this.window.close(kFilesFromPMLoad);
    // Set up the radio buttons
    photomerge.customDialogSetup = function( w )
        var i, button;
        for (i in this.radioButtons)
            button = w.findControl(this.radioButtons[i]);
            button.onClick = this.radioClick;
            // Flag with name so we can identify it in radioClick
            button.button_id = this.radioButtons[i];
        // Missing feature: We should query the selected file's metadata and
        // automatically turn on the '_useLensCorrection' checkbox if the
        // file has the proper support for it.
        w.findControl("_loadcomp").onClick = this.loadCompositionClick;
        // Julie didn't like the intro line; nuke it here because stackDialog looks for it.
        w.findControl("_intro").parent.remove(['_intro']);
        var size = w.findControl("_fileList").size;
        size[1] += 20;
        w.findControl("_LOauto").value = true;        // Set default
        w.findControl("_advancedBlend").value = this.advancedBlending;
        // If the PhotomergeUI or ADM plugins aren't there, don't display the option for it.
        if ((app.systemInformation.search(/PhotomergeUI/) < 0) || (app.systemInformation.search(/ADM /) < 0))
           w.findControl("_PMInteractive").hide();
           w.findControl("_loadcomp").hide();
    // Called by the dialog on closing to collect the results
    photomerge.customDialogFunction = function( w )
        if (w.findControl("_LOinteractive").value)
            this.interactiveFlag = true;
            this.alignmentKey = 'interactive';
        else
            var i, d = [{k:"_LOauto",v:"Auto"},{k:"_LOnormal",v:"translation"},{k:"_LOperspective",v:"Prsp"},{k: "_LOcylindrical",v:"cylindrical"},{k:"_LOspherical",v:"spherical"},{k:"_LOcollage",v:"scen eCollage"}];
            for (i in d)
                if (w.findControl(d[i].k).value)
                    this.alignmentKey = d[i].v;
                    break;
        this.advancedBlending = w.findControl("_advancedBlend").value;
        this.lensCorrection = w.findControl("_useLensCorrection").value;
        this.removeVignette = w.findControl("_removeVignette").value;
    // "Main" execution of Photomerge from the menu
    photomerge.doInteractivePano = function ()
        // Because of the ",true", the dialog is pre-loaded with any bridge files.
        this.getFilesFromBridgeOrDialog( localize("$$$/Private/Photomerge/PMDialogexv=PMDialog.exv"), true );
        try {
            if (this.stackElements && this.doPanorama())
                fitViewOnScreen();
                var flagDesc = new ActionDescriptor();
                flagDesc.putBoolean( kPhotomergeAdvancedBlendingFlag, photomerge.advancedBlending );
                app.putCustomOptions( "PhotomergeFlags001", flagDesc, true );
        catch (err)
            if (this.stackDoc)
                this.stackDoc.close(SaveOptions.DONOTSAVECHANGES)
    // Use this version to call Photomerge from a script.
    photomerge.createPanorama = function(filelist, displayDialog)
        this.interactiveFlag = (typeof(displayDialog) == 'boolean') ? displayDialog : false;
        if (filelist.length < 2)
            alert(localize("$$$/AdobePlugin/Shared/Photomerge/AtLeast2=Photomerge needs at least two files selected."), this.pluginName, true );
            return;
        var j;
        this.stackElements = new Array();
        for (j in filelist)
            var f = filelist[j];
            this.stackElements.push( new StackElement( (typeof(f) == 'string') ? File(f) : f ) );
        if (this.stackElements.length > 1)
            this.doPanorama();
    if ((typeof(runphotomergeFromScript) == 'undefined')
        || (runphotomergeFromScript==false))
        photomerge.doInteractivePano();

  • Image Processor not working in CS 5

    I have installed CS5 Design Premium on my Mac Pro at work. (Had installed the education demo, but it turns out my school doesn't fit Adobe's critereon for eligibility - and doesn't take it back after telling you that) although we have qualified for years, and we education people in 14 countries are are the top school in the world on our subject. No biggie, the upgrade's only $50 more with the NAPP discount.
    But at home it installed just fine on my Mac Pro and works great. But at work, where CS4 works flawlessly, I can't get it to run Image Processor from Bridge, or import photos into Photoshop Layers, it does do Photomerge, but it also does not do HDR PRo.
    Before the settings wouldn't stick in image processor, and I fixed the issue by changing permissions on the Photoshop settings folder in my user account. Now settings stick for Image Processor, but when I tell it to process a set of images, it keeps coming up with a dialog saying "Sorry, I could not process the following files..." and then gives a list of each file with it's the path.
    I'm wondering if the javascrpits running this process are broken, or have permission problems. (Image Processor, HDR Pro, etc.)
    If in Bridge, I seelct Tools->Photoshop->Batch, it gives me an error dialog: "FatalError: General Photoshop error occurred. This functionality may not be available in this version of Photoshop. <No additional Information Available>"
    I rely on Photoshop for a very large portion of my work. And that includes processing thousands of images. I cannot see how this problem is unique to me. Is anyone else having this problem? Is there a fix? Am I stuck with CS4 for automation? BTW, I can use Applescripts to automate Photoshop CS5. How wierd is that? Scripts I wrote work, but built-in ones appear to be broken on this machine.
    Additional information: I'm on a Windows network using Active Directory and my company user account while this is happening. Where it works at home, it's just my own Mac running OS X 10.6.4. I have all the latest CS5 updates installed.

    But all the
    files that are in my home directory (Snow Leopard 10.6.5) give that error.
    Do you have a beta of Snow Leopard, to my best knowledge 10.6.4 is the
    latest version??
    I'm going to format
    the drive on Monday and restore my system from Backup and see what that does.
    First try the uninstall CS5 suite using the uninstaller that is in each
    application folder. Also erase your serial number from computer and run the
    clean script:
    http://www.adobe.com/support/contact/cs5clean.html
    It is useless to reformat and after that reinstall from Back Up when you
    also re install the current preferences, highly likely you will end up with
    the same problem because you copied the old prefs again

  • Connectivity issues - Bridge CC to Photoshop CC - Image Processor issues.

    Hi guys.
    I'm having issues with Image Processor between Bridge CC and Photoshop CC. I can see in the forums that others are having issues that are close to mine but not the same. I can still see my image processor tab in my Tools menu.
    The problem is that I can click the Image Processor tab and it will bring Photoshop CC to the front of all windows, act like its loading, and then nothing happens from there. The run script box doesn't come up, nothing opens.
    I was wondering if anyone else has come across this and if so how you fixed it.
    Thank you

    I'm having the same result when I run image processor from Bridge. Image processor looks like it's about to open, the wait cursor displays (Photoshop CC will open if it's closed), but then when focus switches to Photoshop, nothing happens.
    A few months ago when I tried to upgrade to PS CC 2014 I had the same problem, which was only fixed when I removed all Adobe apps and re-installed CC and Bridge with no PS CC 2014. This might fix your problem if you re-install and only use a single version.
    Currently I have both versions of Photoshop installed again as I need the linked smart object functionality of 2014 but I also need my library of extensions in Photoshop CC. (Really frustrating switch to HTML5 only, by the way Adobe)
    Does anyone know if there is any way to have both versions of Photoshop installed AND have scripts fire off from Bridge?

  • I can't get Dr Browns Image Processor Pro to work from Bridge with Photoshop CC 2014

    We use the wonderful DR Browns Image Processor Pro script a lot, but cannot get it to work from Bridge with PS CC 2014. When I select files in Bridge CC and then go to Tools> Dr Browns Services 2.3.1 > Image Processor Pro it just pops up an error message that says ReferenceError: photoshop is undefined.
    The actual script works fine if I launch it from Photoshop CC 2014 - just not if I load it from Bridge CC.
    I have unistalled it and re installed a few times, both manually and through the Extension Manager CC.
    I am using a Win 7 64bit computer.
    I assume there is some change in the scripting part that loads Photoshop from bridge but not sure. It worked fine in CC. Just not CC 2014.
    I opened the Dr Browns Services .jsx file but don't see anything obvious. This is the section related to the Image Processor Pro part:
      // This routine takes an array of files. If called by Photoshop,
      // it will invoke Dr. Brown's Process 1-2-3 with the files. If called by
      // any other app, it will send a BridgeTalk message to Photoshop
      // to invoke this routine with the same arguments.
    drbrownserv.process123 = function (files) {
    // Bring Photoshop to the foreground.
      BridgeTalk.bringToFront ("photoshop");
      // Create a new BridgeTalk message for Photoshop to invoke
      // Image Processor with the selected files
      var btMessage = new BridgeTalk;
    btMessage.target = "photoshop";
      btMessage.body = "drbrownserv.process123 (" + files.toSource () + ");";
      btMessage.send ();
      } else {
    photoshop.runActionCommand ('611736f0-9c46-11e0-aa82-0800200c9a66', files);
      catch (error) {
      if (error.number != 8007) // Don't report user cancelled errors.
      drbrownserv.alert (error);

    I copied that .jsx file to a new name "Xbytor Image Processor Pro.jsx" edit that file changed the string Dr Browns services to "Xbytor Image Processor Pro" then commented out all the code that added tools menu items but "Image Processor Pro" and I put that file into
    "C:\Program Files (x86)\Common Files\Adobe\Startup Scripts CC\Adobe Bridge" even though Bridge CC is 64Bit seems to use theat location.
    Bridge CC was updated by the creative clouds update and opens Photoshop CC 2014 now

  • Image Processor Pro and Picture Processor load eps files without rasterizing them

    Hi. My name is Lucas. Im from Argentina, now living in Brazil. I have the problem that is in the title. Im new doing this stuff but reading a lot i discovered that both scripts open eps files and because they dont get reasterized, then saved files looks preety bad.
    I know that there are some parameters to open eps, ex:
    var epsOpenOptions = new EPSOpenOptions();
       epsOpenOptions.antiAlias = true;
       epsOpenOptions.mode = OpenDocumentMode.RGB;
       epsOpenOptions.resolution = 72;
       epsOpenOptions.constrainProportions = true;
    I have to say that looking for a solution a found a script and modified to suit partially my needs. I said partially because i need the script to look folders and save output files with same structure. Here is the script that manage one folder at a time:
    #target photoshop
    // Asks user for input folder
    var inputFolder = Folder.selectDialog("Select a folder to process");
    // Asks user for output folder
    var OutputFolder = Folder.selectDialog("Select a folder to save your Tiffs");
    if ( inputFolder != null && OutputFolder  != null ) {
       // Makes list of all files located in that folder
       var fileList = inputFolder.getFiles( "*.eps" );
       // Create a EPS option object [height & width are doc size]
       var epsOpenOptions = new EPSOpenOptions();
       epsOpenOptions.antiAlias = true;
       epsOpenOptions.mode = OpenDocumentMode.RGB;
       epsOpenOptions.resolution = 72;
       epsOpenOptions.constrainProportions = true;
       // Open each file in turn
       for (var i = 0; i < fileList.length; i++) {
          // open the file
          app.open( fileList[i], epsOpenOptions );
          var baseName = activeDocument.name.slice( 0,-4 );
          // put your code to 'save as' the file here
          var saveFile = new File ( OutputFolder + "/" + baseName + ".jpg" );
       SaveForWeb(saveFile,60); // set quality to suit
    function SaveForWeb(saveFile,jpegQuality) {
      var sfwOptions = new ExportOptionsSaveForWeb();
      sfwOptions.format = SaveDocumentType.JPEG;
      sfwOptions.includeProfile = false;
      sfwOptions.interlaced = 0;
      sfwOptions.optimized = true;
      sfwOptions.quality = jpegQuality;
    activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, sfwOptions);
    activeDocument.close( SaveOptions.DONOTSAVECHANGES ); 
    So, if you know some way modify image processor pro or picture processor i will be very pleased.
    Because i will only use the script to manage eps files and save them as jpg (save for web) i dont need an special button to activate that option. Keep it simple. Thanx!!

    You can tweak ImageProcessorPro.jsx by make the following edit.
    Search for code that looks like this:
    ImageProcessor.prototype.openDocument = function(file) {
      var self = this;
      var settings = self.settings;
      var mode = DialogModes.NO;
      var ext = file.strf("%e").toLowerCase();
      var isRaw = ImageProcessor.CAMERA_RAW_FILES.contains(ext);
      if (isRaw) {
    and insert this code right after it:
      if (ext == "eps") {
        var epsOpenOptions = new EPSOpenOptions();
        epsOpenOptions.antiAlias = true;
        epsOpenOptions.mode = OpenDocumentMode.RGB;
        epsOpenOptions.resolution = 72;
        epsOpenOptions.constrainProportions = true;
        try {
          var doc = app.open(file, epsOpenOptions);
        } catch (e) {
          Error.runtimeError(9002, ZStrings.UnableToOpenErr);
        return doc;
    I haven't tested this at all but it looks good from here.

  • Image Processor Not Working

    Hi,
    I used the Image Processor feature to resize and save in a separate folder all the time in Bridge CS3. I recently upgraded to CS4 and I can't get the Image Processor to work. When I select the feature, it opens photoshop but nothing happens...it just opens the photoshop window but does nothing. Can anyone help? Does the feature not function in the same way for CS4? How do I properly use Image Processor in Bridge CS4? Thank  you!

    But all the
    files that are in my home directory (Snow Leopard 10.6.5) give that error.
    Do you have a beta of Snow Leopard, to my best knowledge 10.6.4 is the
    latest version??
    I'm going to format
    the drive on Monday and restore my system from Backup and see what that does.
    First try the uninstall CS5 suite using the uninstaller that is in each
    application folder. Also erase your serial number from computer and run the
    clean script:
    http://www.adobe.com/support/contact/cs5clean.html
    It is useless to reformat and after that reinstall from Back Up when you
    also re install the current preferences, highly likely you will end up with
    the same problem because you copied the old prefs again

  • Error message when trying to use image processor in CS2

    Hi
    I am trying to use image processor to condense 500 proofs for my website - however although I have done many times before with no problem, now when I hit the Image processor button before I even get to key in details it is bringing up the sorry something major has happened message and I can't continue - the details of this message are as follows - ref error : this.dlgMain.ddset on Change is not a function :810 - does this mean anything to anyon? Any ideas on how to overcome would be much appreciated.
    thanks

    Go to Russell Brown's website and download his package for CS2. His 1-2-3 Processor is much more flexible than the one provided by Photoshop.

  • When in Bridge, my image processor won't work anymore

    When I am in Bridge I go to Tools>Photoshop>Image Processor and the dialog box doesn't come up anymore. It does nothing. I use Creative Cloud and all plugins are updated. Help!

    I once had functions like Photomerge go kablooey when I uninstalled Photoshop CC (once I was comfortable using Photoshop CC 2014). A complete uninstall and reinstall fixed it.
    Do any of the other Photoshop tools function properly?

  • Bridge CS6: How do you write a script to assign a shortcut to "Batch" and "Image Processor"?

    Many times a day I need to access "Batch" and "Image Processor" in Bridge.
    There is no shortcut, so I have to go the Tools-Photoshop-Batch and Tools-Photoshop-Image Processor menu - the items I need are locked into a second level menu.
    Which is impractical.
    I remember, when I started out with Photoshop many years ago, I downloaded "Deke Keyes" from Deke McClelland, which included keystrokes for "Batch" and "Image Processor".
    From the Bridge forum I learned that you cannot assign shortcuts in Bridge CS6.
    So the general opinon was that a script was used to assign the shortcuts.
    Could you please tell me how to do that?
    Thanks!
    PS: I tried to assign shortcuts via the Mac OS X Mountain Lion keyboard preferences (applications), but it did not work.

    Hi,
    in the exit:Event of the 1st date field add this FormCalc script:
    DateField2 = Num2Date(Date2Num($.formattedValue, "DD.MM.YYYY") + 21, "DD.MM.YYYY")
    You may have to change th date pattern  "DD.MM.YYYY" in the way you need it.

  • Photoshop CS3, wanting to batch re-size JPGs, going: file-scripts-image processor, the batch images are greyed out can't be highlighted

    Hi - I am trying to batch re-size JPGs in CS3.  I go: file-scripts-image processor and select a batch of JPGs but these are greyed out and can't be highlighted, therefore can't be re-sized. This function worked in the past and suddenly does not. Reading forums on this topic I find I should remove/trash 'Photoshop Preferences'. But I am struggling to find Photoshop Preferences. Really would appreciate simple instructions written for the layman not a computer savvy individual, on how/where to locate these, please. Many thanks.

    A few things to try.
    1)Since jpg's are finiky with bit modes, make sure your mode is in 8-bits per channel only. (found in the image>mode menu)
    2)you could try resetting the preferences by using the 3 modifier keys at startup. ctrl-alt-shift(windows) cmd-opt-shift(mac) Hold these three keys down when you start photoshop if done right when photoshop starts you should get a dialog box asking if you want to reset the preferences)
    3)If these do not help specify the version of photoshop, what OS you have and its version. Then someone can tell you the location of the preference files since it is different on windows vs. a mac.

  • Bridge Image Processor TIFF format

    I use Bridge's Image Processor to batch JPEG images to TIFFs before Photoshopping them, but I've noticed that it saves TIFFs with Mac byte order by default.
    This isn't usually a problem, but many of these images will move to another department in my organisation for inclusion in eBooks and other digital publications, and the Mac byte order causes issues for them and their production processes, necessitating a batch process back to IBM PC order.
    Is there anyway to change the default Image Processor format to IBM PC byte order?

    That's what I thought, but the script doesn't have those parameters, so it would probably be a matter of delving deeper than the Image Processor functionality.
    I can make batch that would do it, rather than Image Processor, but it would be nice to have this feature built-in.
    I'll see what the PS forum has to say.
    Cheers.

  • Why am I getting this error when trying to do Image Processor?

    Ok I am using Bridge & Image Processor to add a water mark to multiple photos at a time with my ready made action.  But for some reason I seem to be getting this error message every few pictures?
    I've never had problems with other photo sets doing this before, but it was just recently that it started.
    But it will successfully add the water mark to some of them via the Image Processor

    Actually, my DVD multi-drives are I:\ and J:\, as my C:\ thru H:\ drives are my individual internal HDD's. Even on my laptop, my multi-drive is F:\. I always list my internals in order, and my multi-drives afterwards. In my case, it's simple layout for simple minds. I am also keen on having my internals listed at the hardware level as 0 = C:\, 1 = D:\, 2 = E:\, 3 = F:\ and so on. Once let a builder deviate from this order and it bit me big time - never again!
    Now, you are possibly correct that the D:\ might be the OP's D:\ is the multi-drive, and now some source disc is not in it. To keep this sort of thing from happening, I ALWAYS Copy my Assets to an internal from my externals (usually), my NAS, and from any archive discs. Importing/Opening from a DVD/CD is often asking for trouble.
    Good luck to the OP,
    Hunt

  • Tools Photoshop Image Processor improvement needed

    If I use the Image Processor feature to convert images and I click on "Save in same location", then the images should be saved in (wait for it)...
    The same location!
    Please add an option to create a new directory for the converted files.

    It's part of the Photoshop install and runs within Photoshop! Bridge simply provides a convenient method accessing it and other Photoshop, InDesign, GoLive, Illustrator scripts.
    From the most recent version (available from the site I linked to):
    // 4/20/2006 9:00 --- tpr
    // Rudy's version runs Action at end of process.
    // c2005 Adobe Systems, Inc. All rights reserved.
    // Produced and Directed by Dr. Brown ( a.k.a Russell Preston Brown )
    // Written by Tom Ruark
    // UI Design by Julie Meridian
    They're all Adobe employees and the script is "supplied" by Adobe. That said, 2+2 doesn't always equal 4. Check out Dr Browns website and the maths should become a bit clearer.

Maybe you are looking for