Image Processor Task Progress

Bridge should display an overall progress bar when it is performing a batch image processor task. It would be nice to see at a glance how many of the images have been completed and how many remain.
Bridge should have an option to play a sound (fanfare) when it completes a batch image processor task.

it seems to me that there should be a script command for the progess bar. Simply put, a call to show the progress meter with a particular value. Pseudo-code:
n = 0;
while (loop)
n++
progress_meter ("message here", n / total)
[...work]
end
I don't know applescript, so the syntax is for demonstration only. But the point is that if bridge/photoshop had a entry point for scripts to initiate a progress meter, the script-writer can choose how to present the interaction to the user.
The API proposal I used above assumes that the first parameter to the function is a message to display in the progress meter, and the second parameter is a percentage value to indicate how far along the meter should present.
Perhaps there could be other params to pop it up and to take it down, which would only be necessary when the user wants to do so independently of the default behavior (which would be to pop up upon the first call to it, and to take it down when the script ends).
dan

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?

  • Image Processor prompts to hit "OK" within an action.

    I am making incremental scale adjustments to an image and saving each change as a separate jpg.  The result is a series of jpgs that will be animated as an image sequence in After Effects. 
    The scale adjustment and the saving process (using “image processor” because of the sequential numbering of each jpg file) is executed through Actions in Photoshop.  The issue is that every time Actions comes to the image processor window it prompts me to confirm by pressing “OK”.
    Is there a way for Actions to automatically accept “OK”?  Also, if there is any other way this task can be carried out automatically, please let me know.
    A separate but related issue–can I specify how many times Actions plays so I wouldn’t have to manually initiate each cycle?
    Thanks
    Raff

    I have no After Effects-experience, but could one not rescale placed images in that program with more ease than your current route offers?
    Anyway I don’t think you can utilize Image Processor in an Action the way you want to; but you could use a custom Script for saving jpg-copies with progressive numbers.
    A separate but related issue –can I specify how many times Actions plays so I wouldn’t have to manually initiate each cycle?
    Please give more details; run the same Action on the same file repeatedly or is a Close-command part of the Action and you want the Action to run on several open files?
    In both those cases Actions would fall short (apart from duplicating their content the appropriate number of times) in my opinion and Scripts would probably offer a better fit.

  • File Place does not appear on my menu. Neither does Tools Photoshop Image processor.

    In Bridge File>Place is grayed out on my menu. Tools>Photoshop>Image processor does not appear at all.  I have reset the preferences numerous times and am good to go until I shut down my computer.  When I reboot they are gone again.  I have a Mac with OS 10.10.2 (Yosemite) and CC. 

    Mardi Carter wrote:
    I shut down using "Shut Down" under the Apple menu.....always…
    Well, that's fine for the OS, but sometimes not so great for Photoshop.  Try QUITTING Photoshop from the Photoshop menu, or by Command Q, before you get anywhere near your Apple menu .
    Gene gave you sound advice, but don't forget to run Repair Permissions with Apple's Disk Utility before and after any installation, upgrade or update of the OS or any application.
    You'd think that shouldn't be necessary, but it is indeed vital, indispensable routine maintenance.
    Forget about "it had never happened before", Yosemite is a work in progress.  Apple never gets a major OS X release right until about the dot four or five release, so Yosemite has a way to go before it's at 10.10.4 or 10.10.5.  That has proven to be the nature of the beast.

  • Updated to new 2014 cc. In bridge when I go to tools/Photoshop/Image Processor....I get this message "adobe photoshop 2014 CC has quit working" Anyone have a fix for this??

    updated to new 2014 cc. In bridge when I go to tools/Photoshop/Image Processor....I get this message "adobe photoshop 2014 CC has quit working" Anyone have a fix for this??

    I use a  windows 7 pro and have no problem like that from bridge cc when I select a thumbnail then use menu Tools>Photoshop>Image Processor..  I see Adobe Photoshop CC 2014 start up then I see the Image processor dialog and that one file is selected in the bridge I the complete the dialog and click run.  The image files are created. Photoshop remains open after the image files are create with no open documents. I need to click on the bridge in the task bar to bring bridge back into focus.
    What does you system configuration?

  • Image processor keeping files open in PS CC - not saving

    I am trying to use my watermark action with image processor to "process/batch my high resolution for print files to be for web png" my files all at once [saving as PNG]
    Photoshop is keeping the files open with out saving them.
    my action consists of-
    placing an image
    fit image [makes low res for web]
    set selection
    align
    flatten
    i used this action in my previous version of PS with no issues.
    tried re-making the action- same thing happened.
    Please help
    Thank you!!

    I haven't experienced that problem. But a related annoying problem with batch actions in CS4 is that if I minimize Photoshop while a batch action is running, the program interface minimizes, but the images open and close on the desktop still. In prior versions of PS, I could minimize the program and the batch action would go on in the background, invisible to me, while I could do other tasks. But now, when I run a batch to convert over 1000 files, each one pops open on the desktop, in front of any other open app's windows. It then closes and the next one opens, etc. Which means my computer is unusableduring any batch command.
    Very annoying! How could the QA and beta testers have not noticed this?

  • How to batch resize in Bridge CS6 or Image Processor using height only?

    I have batches of images that need to resized based on height only and would like to do so using Bridge/Image Processor. My height requirement is 1140px, however the original images are varied in landscape/portrait orientation and are of different aspect ratios (2:3, 3:4, etc). So far what I have had to do is filter in Bridge just the landscape images then select an aspect ratio, then plug into Image Processor the exact pixel dimensions of the resized images (that I discovered using Photoshop to resize and check the resulting pixel dimension). There has to be a more efficient way.
    An example of what I am running into:
    Image 1
    Original file = 5616 h x 3744 w Portrait orientation
    Resized file = 1140 h x 760 w
    Image 2
    Original file = 3744 h x 5616 w Landscape
    Resized file = 1140 h x 1710 w
    Image 3
    Original file = 4652 h x 3489 w Portrait
    Resized file = 1140 h x 855 w
    From that example, is there a way I can plug just the height number in Image Processor (or any other Photoshop utility) so I can just batch out a bunch of images all at once?
    FYI - I am not interested in buying any new software such as Lightroom to accomplish this task. I would like to remain within Photoshop/Bridge if possible.

    You can do what you want with Image Processor without a script.  All you have to do is enter the number of pixels you want for the height (1140 pixels in your case) and then enter a number for the width that is wider than any image you will process.  Image processor will always resize the images to fit inside this rectangle.  That is, the height will always be 1140 and the width will fall where it may.  It works like the Fit Image command in Photoshop.

  • PSCS4 Memory Error with Image Processor

    When I use the image processor in PSCS4 to process a large number of raw files using ACR 5.1 (Nikon D3 NEFs), I consistently receive an error message after about 10-11 files have been processed that the instruction at 0x696336ab tried to read memory at 0x6C (or thereabouts) and the memory could not be read. I am saving as JPEGs with the color space set to sRGB.
    I de-installed and reinstalled PSCS4, but the error persists. The image processor worked fine with PSCS3. A workaround that solves the problem is to process the files as a batch using a simple action to accomplish the task.
    I am running Windows XP Pro Service Pack 3 with a dual Xeon processor and 2G of error correcting memory.

    Hmm.. I was getting a similar error with CS3 and was very happy to find that it appeared to be cured in CS4. The CS3 issue would appear if I tried to process more then 100 NEFs. My workaround was to do them in smaller batches (60-75). Perhaps you might try reducing the memory alotted to PS or run it without any other apps running?
    Russell

  • 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();

  • Minor modification to Dr Browns Image Processor Pro?

    I came across Dr Browns fantastic script and I'm hoping there's a developer that might be able to help with a minor (?) revision to the code.
    He has kindly released the source code on his website  http://www.russellbrown.com/images/tips_downloads/OpenSource.zip
    I need it to do two main things:
    Save 1. run a renaming convention on the original images and retain the file type/ extension
    Save 2. resize the images for web (incorporating an action called up from PS to convert to RGB). No problems here.
    I know I can do this in a two step process with bridge to rename and then use the script (or indeed a droplet) to resize for web, but I wish to keep this as a one step process.
    Image Processor Pro does both of these fine except for one thing:
    I need an option in Save 1. to save files in the format they already are - rather than forcing all files to save into a particular format.
    I get hundreds of images from various companies (I work as a designer for an arts organistion) and they are all in a variety of formats and I want to maintain the highest possible quality file we are provided.
    Basically I want the option of using the naming convention section of the script without the file save as file type bit.
    This assue this could be done by either skipping the File Type/ Quality section altogether (but keeping the save to subfolder), or by including "keep current extension" into the file type drop down.
    Things that would also be great:
    3. An option to delete/ replace originals in the process (as I will be deleting these anyway)
    4. The script can be made into a drag and drop application that calls up bridge/ PS?
    Any assistance on this would be great.
    PS- I have posted this over on the Photoshop discussion page as well, as that is where I came across the scipt in the first place.
    http://forums.adobe.com/message/5856877#5856877
    Thanks

    Yup didn't realise you are on mac. 
    If you don't want to keep the originals with their original names (ie if you're just overwriting the originals) then why mot just batch rename in bridge first?  If you run an action or script then you'll have to wait whilst each file is opened and saved, whereas you run a batch rename and it's a file system task - virtually instantaneous.
    Then just image processor, or a batch action from bridge (I'd create the latter because the. You can reuse it without needing to check settings or destinations over and over)

  • Image Processor script won't close windows

    I'm testing a client's favorite method for converting folders of, say, 1000 images from RAW to large JPEG. He now uses Photoshop in CS3: He opens File Menu > Scripts > Image Processor, designates a huge folder of RAW files, sets the right parameters, and saves to a different folder. Works perfectly (but slowly) on a Mac G5.
    Now I am testing it on a Mac Pro in PS-CS4, the setup he wants to buy, using exactly the same parameters. Trouble is, the window that opens on each document isn't closed, and so they accumulate! Doesn't matter whether Tabs is enabled or not. Starts eating up scratch space and has the potential to open 1000 tabs or windows. Something is wrong.
    Same operation works perfectly in PS-CS3 on this Mac Pro.
    If the Close Window is missing from this repeating script, then it should be added back -- or a checkbox should be added: "Close each window." I haven't been able to create an Action that will close each window without confusing the Save/Save As mechanism in the script.
    How can I report this apparent bug? Or can someone please tell me what I'm missing.
    (I know there are other ways to accomplish this task. But this one should work!)

    From Kathy: "I still can not find out your issues here. You may try report this to adobe through this link.
    http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform"
    Thank you, Kathy! This was the tip I needed. I thought that Adobe may, indeed, be monitoring this forum. Many manufacturers monitor and post in their own forums, e.g. Apple.
    "Also one simple workaround for you, could be create a close action and run this action in Image Processor."
    I really did try this. Trouble is, you run into unresolvable interactions with a Save As dialog. I.e. the Close Action seems to interfere with the saving of the converted JPEG. At least I couldn't get it to work -- but it should not be necessary.
    There are workarounds, such as selecting multiple items in Bridge, opening them all into ACR, and then selecting them all and clicking Save File. Doesn't open any windows at all! But the bug still needs to be reported.
    From Ramon: "Before your frustration causes you to become overly argumentative, you may want to consider that your interlocutor may actually know a bit more than you seem to think she does. Kathy may even be part of the Adobe team, for all you know."
    You are reading way too much into what I said. Argumentative? I meant what I said literally. The behavior of the Image Processor script should not have any dependencies, and the documentation (such as it is) indicates none whatever. Further, the script, when run identically in CS3, runs perfectly.

  • Image Processor problem

    When I try toi use image processor from Bridge it says that PS is busy with another task, but PS is not busy with another task. I'm using LR,BR, and PS all in CC

    I have had a similar (the same?) problem with scripts and automated tasks.  I am on a Mac and have found cleaning the inactive memory works 100% of the time when I come across this issue (usually after running an intensive batch of commands).  It's like PS doesn't know how to release the memory it has been using.  Anyway, I use Memory Clean, and it is fine. 

  • Image Processor Pro v3.0.1 is released

    Image Processor Pro v3.0.1 is released and can be found here:
    ps-scripts - Browse /Image Processor Pro/v3_0_1 at SourceForge.net
    Here are the changes:
    ---------------------------- v3.0.1 ----------------------------------
    - Removed 'Cancel' button on startup progress window. It didn't work
    and would require some gymnastic coding to implement usefully.
    - Added 'BatchMode' flag for calling IPP script from other scripts.
      See demo script RunIPP.jsx for more details.
    - Fixed window title to reflect correct script version
    - Tweaked text in log file for readability
    - Changed behaviour of 'Selection from Bridge' to match behaviour in
    Contact Sheet II. If Bridge is running and no files are currently
    selected, all image files in the current folder in Bridge will be
    processed. The number of files to be processed is now present in the UI.
    - Added Progress Bar. This is enabled with the flag
    ImageProcessorOptions.USE_PROGRESS_BAR. The default is true.
    - Added the ImageProcessorOptions.PROCESS_UNSAVED_IMAGES flag to permit
    processing unsaved images. The default is false. You must edit the
    script to enable this functionality.
    - Fixed JPG Format Progressive bug. The number of scans was not being
    set. The variable FileSaveOptions.DefaultJPGScans can be modifed to
    change it from the default value of 3.
    - Fixed for situations where there are no Action Sets or no Actions
    in the selected Action Set.

    Much appreciated, xbytor2. 

  • Getting Russell Brown's Image Processor Pro to work with an action

    I have Photoshop CS6 with Russell Brown's Image Processor Pro installed.
    I have the ongoing task of processing pics of different sizes and different width/height ratios.
    I would like to get the following result using IP Pro (in collaboration with an action):
    1. Downsize pic to 960 pixels wide (height doesn't matter, but needs to stay in ratio)
    2. Watermark pic.
    3. Save.
    4. Creating a thumbnail of 320 x 213 pixels, without distorting ratio. This may mean downsizing to 320 wide with relative height, *then* cropping via Image-Canvas Size. Chopping a bit off is preferable to me than distorting the ratio.
    5. Save the smaller version as 'Documentnamex' (i.e. adding an 'x' to the document name for the thumbnail.
    I have 1-3 in an action and have used it for years.
    But as for the task of a smaller thumbnail, kept in ratio but chopped and named with an x - I am stumped. I downloaded IP Pro for the task, but I can't get it to work.
    If I save the original with IP Pro (at step 3), how do I then get it to make the thumbnail?
    If I create the thumbnail in the action, *then* do 2 saves in IP Pro (thumbnail and 960 version), the bigger one will be pixelated (and no surprises there)
    Summary: I want 2 watermarked versions:
    1. 1234a.jpg: 960 pixels wide, height relative
    2. 1234ax.jpg: thumnail, 320 wide x 213 high
    Can anyone help? Am I asking too much of the software?

    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 does not work correctly

    Two problems and one suggestion here:
    1. When using the Image Processor Script to resize images only the first image in a folder will get resized correctly. Subsequent files just get coppied at their original size.
    2. The script ignores the width setting and adjusts based on height.
    Additionally, it would seem to me like a Percentage selection and/or a Maintain Aspect Ratio selector would be a huge help.

    Hi there,
    the images I wanted to process were initially located on an external hard drive that had 10GB left. I then moved the file onto my laptop, which has about 160GB free space, but that didn't solve the problem. I have tried the same task with just 2 images, and get the same response. I am not sure what you mean by 'complete path', but the folder is just a normal folder with camera RAW FILES (CR2). However, I have tried to convert a TIFF to JPEG too via image processor and that hasn't worked either?

Maybe you are looking for

  • XML Publisher report ends in Warning with java.lang.OutOfMemoryError

    Hi, We are modifying the standard report Account Analysis Report (in Subledger Accounting) to create a custom report. When run wide open, it is ending in Warning with the error java.lang.OutOfMemoryError in OPP Log. We are on EBS 12.1.3. DB 11.2.0.3

  • Unable to generate any form in oracle r12

    Dear Gurus, suddenly we can't generate any form "standard or customized" with following error: frmcmp_batch Module=$AU_TOP/forms/US/INVGIPDP.fmb Userid=apps/apps compile_all=yes module_type=form batch=no output_file=$INV_TOP/12.0.0/forms/US/test.fmx

  • Is there an antspert in da house?

    Hi, I'm trying to compile & jar a simple java project using ant 1.7 and java 1.6 on windows XP. The problem appears to be the ant is not finding my *.java files... atleast it's not producing a jar file, and no class files either. the build says it wo

  • Drop down menu to select a signature graphic file is only in pdf format

    Help. . .Acrobat Xi will not let me select any other than a .pdf file for my graphic signature.  My signature is in a JPEG file format. But when I am in the "Configure The Signature Appearance" screen and I go down to the bottom. . . it only has the

  • How do you delete your skype messages

    This is crazy, before i could delete my messages, now cannot. Seems others are having the smae problem. No one is getting the help they need.