Photoshop script to export groups as folders?

Hello

I work with a .psb file that has about 100 groups with layers in them. I would like to export these groups into folders containing a file .png for each individual layer inside. If I create the folders manually and reorganize the files png inside of them, it would take me several hours. I can't find a script that works. Any ideas? Thank you much in advance.

This script will create a folder for the file name and the groupnames with png files.

#target photoshop;
app.bringToFront();

main();
function main(){
if(!documents.length) return;
try{
var doc = app.activeDocument;
app.displayDialogs = DialogModes.NO;
pngSaveOptions = new PNGSaveOptions();
var LSets = getLayerSets();
if(LSets.length < 1) return;
try{
var Name = doc.name.replace(/\.[^\.]+$/, '');
var docPath = doc.path;
}catch(err){
    alert("This document needs to be saved before running this script!");
    return;
    }
var OutputPath = Folder(docPath + "/" + Name);
if(!OutputPath.exists) OutputPath.create();
for(var f in LSets){
    var LayerSetIndexs = getChildIndex(Number(LSets[f][0]),false);
    var groupFolder = Folder(OutputPath + "/" + LSets[f][1].toString());
    if(!groupFolder.exists) groupFolder.create();
    for(var x in LayerSetIndexs){
       selectLayerByIndex(Number(LayerSetIndexs[x]));
       var Kind = activeDocument.activeLayer.kind;
        var Shape = isShapeLayer();
if(Kind ==LayerKind.NORMAL || Kind == LayerKind.SMARTOBJECT || Kind == LayerKind.TEXT || Shape == true){
    dupLayers();
    var saveFile = File(groupFolder + "/" +  activeDocument.activeLayer.name + ".png");
      activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);
    app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    }else{ continue; }
        }
    }
}catch(e){}
};
function isShapeLayer(){
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID('Lyr '),charIDToTypeID('Ordn'),charIDToTypeID('Trgt') );
desc =  executeActionGet(ref);
if(!desc.hasKey(stringIDToTypeID('adjustment')) ) return false;
if(desc.getBoolean(stringIDToTypeID('hasVectorMask' )) == true)  return true;
return false;
};
function getLayerLayerSectionByIndex( index ) {
   var ref = new ActionReference();
   ref.putIndex(charIDToTypeID('Lyr '), index);
   return typeIDToStringID(executeActionGet(ref).getEnumerationValue(stringIDToTypeID('layerSection')));
};
function getLayerNameByIndex( index ) {
    var ref = new ActionReference();
    ref.putIndex( charIDToTypeID( 'Lyr ' ), index );
    return executeActionGet(ref).getString(charIDToTypeID( 'Nm  ' ));
};
function skipNestedSets( layerIndex ){
   var isEnd = false;
   layerIndex = app.activeDocument.layers[app.activeDocument.layers.length-1].isBackgroundLayer ? layerIndex-2:layerIndex;
   while(!isEnd){
      layerIndex--;
      if( getLayerLayerSectionByIndex( layerIndex ) == 'layerSectionStart' ) layerIndex = skipNestedSets( layerIndex );
      isEnd = getLayerNameByIndex(layerIndex) == '' ? true:false;
   }
   return layerIndex-1;
};
function getChildIndex(idx, skipNested ){
   var layerSetIndex = idx;
   var isEndOfSet = false;
   var layerIndexArray = [];
   while(!isEndOfSet){
      layerSetIndex--;
      if( getLayerLayerSectionByIndex( layerSetIndex ) == 'layerSectionStart' && skipNested ){
         layerSetIndex = skipNestedSets( layerSetIndex );
      }
  if(getLayerLayerSectionByIndex( layerSetIndex ) == undefined) break;
      isEndOfSet = getLayerNameByIndex(layerSetIndex) == '' ? true:false;
     if(!isEndOfSet ) layerIndexArray.push( layerSetIndex );
   }
   return layerIndexArray;
};
function getLayerSets(){
   var ref = new ActionReference();
   ref.putProperty( charIDToTypeID( "Prpr" ), charIDToTypeID( 'NmbL' ));
   ref.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
   var count = executeActionGet(ref).getInteger(charIDToTypeID('NmbL')) +1;
   var Names=[];
try{
    activeDocument.backgroundLayer;
var i = 0; }catch(e){ var i = 1; };
   for(i;i 
         

Tags: Photoshop

Similar Questions

  • Open an exported file directly in Photoshop (after the exported file created)

    var doc = app.activeDocument;
     var destFolder = Folder ("~/Documents");
    
    if (destFolder) {
         var fileName = activeDocument.name;
        var destFile = new File(destFolder + '/' + fileName);    
        var psdExportOptions = new ExportOptionsPhotoshop();
        // Set PSD export options 
        psdExportOptions.saveMultipleArtboards = true;
        psdExportOptions.artboardRange = "1";
        psdExportOptions.antiAliasing = false; 
        psdExportOptions.resolution = 300; 
        psdExportOptions.embedICCProfile = false;
        psdExportOptions.writeLayers = false; 
        psdExportOptions.imageColorSpace = ImageColorSpace.CMYK;
        doc.exportFile (destFile, ExportType.PHOTOSHOP, psdExportOptions);
    }
    

    This code, I have exported my current AI document as a PSD with set options. He also names the new file how it's called in artificial intelligence.

    How can I call the file created and open it directly in Photoshop? Keep in mind that I would work on several files so that the file names would change every time I ran this Script to export.

    I could call a file named specifically and open that, but not what I need this script to do. I just need to open the newly created PSD file. Any help would be greatly apreciated!

    Hi Mark,

    BridgeTalk or for simple commands like this, Interapp communication (Cross-DOM)

    use photoshop.open (fileObject);

    before that, you need to construct your newly exported file object

    .
    .
    .
         doc.exportFile (destFile, ExportType.PHOTOSHOP, psdExportOptions);
    }
    
    var psfile = new File(destFolder + '/' + fileName.split('.')[0] + '-01.psd');
    
    if (psfile.exists) {
         //alert('file exists')
        photoshop.open(psfile);
    }
    else
        alert('file does not exist');
    
  • face detection? Photoshop script

    Hello

    I explored the possibility of automatic detection of faces and selection using photoshop script. Anyone tried something similar? Please guide me in the right direction.

    I need find and automatically select the face (with head) and move in different layers.

    http://facedetection.jaysalvat.com/  This Web site is Jquery. But I wanted to do with the photoshop script.

    faces.JPG

    mahendrak15024337 wrote:

    Thanks JJMack!

    Let's say if we leave selection of face. But is there any command/method photoshop script that detects if the layer/image has sides on it or not?

    Thanks again!

    If you leave the detection of face, how do we know if there is a face or not in a layer.  Same Adobe Face detection detects all the faces in the pictures.  New face in CC 2015.5 detection liquefy had no problem finding all 8 faces in your example.  Yet, I saw portrait images, in that it has failed to identify a face.  CC 2015.5 has so many issues, I do not use it.   Older versions of Photoshop CS6 starting have face detection in color range to help select the skin.

  • Need a little help. Script to export the single document for different types of files.

    Hey guys, I'm new to scripting. have looked everywhere but cannot find an answer to this, I'm sure it's pretty simple


    At work we export logos all the time in a few different formats for the clients.
    I looked in the script as a way to automate the process.

    So far, I thought a little script to export my Illustrator formats document... now I need to be able to export this document even outside as a res low and high PNG, low and high res JPEG, EPS, PDF and TIFF etc.
    I have scripts to do all these separately but just need to know how to put it all in a single script I can do all at once

    Here is an example of my two different scripts to export PNG. I just need to know how string together so I can add all of the formats without breaking it.

    function savePNG() {}
    var destFolder = Folder.selectDialog ("select the folder to export the PNG files to :');")
    If {(destFolder)
    If (app.documents.length > 0) {}
    var Nomdoc = app.activeDocument.name.match(/^.*[^.ai]/i);
    var destFile = new file (destFolder + ' /' + Nomdoc + "-HR.png");
    if(destFile == null) {return ;}
    var doc = app.activeDocument;
    var artRect = doc.artboards [0] .artboardRect;
    var exportOptions = new ImageCaptureOptions;
    exportOptions.resolution = 300;
    exportOptions.antiAliasing = true;
    exportOptions.transparency = true;
    doc.imageCapture (destFile, artRect, exportOptions);
    }
    }
    }
    savePNG();

    and here is the version low resolution

    function savePNG() {}
    var destFolder = Folder.selectDialog ("select the folder to export the PNG files to :');")
    If {(destFolder)
    If (app.documents.length > 0) {}
    var Nomdoc = app.activeDocument.name.match(/^.*[^.ai]/i);
    var destFile = new file (destFolder + ' /' + Nomdoc + "-LR.png");
    if(destFile == null) {return ;}
    var doc = app.activeDocument;
    var artRect = doc.artboards [0] .artboardRect;
    var exportOptions = new ImageCaptureOptions;
    exportOptions.resolution = 72;
    exportOptions.antiAliasing = true;
    exportOptions.transparency = true;
    doc.imageCapture (destFile, artRect, exportOptions);
    }
    }
    }
    savePNG();

    Thanks for any advice you can give!
    Eli

    Oh, you want to perform two functions, one after another at the same time? then just name with different names and perform one function after another, if all files will be saved in the same folder, the argument selectDialog move method on each of your functions to don't do only once.

    function savePNG_HR(){
        var destFolder = Folder.selectDialog('Select the folder to export the PNG files to:');
        if (destFolder) {
            if(app.documents.length > 0){
                var docName = app.activeDocument.name.match(/^.*[^.ai]/i);
                var destFile = new File(destFolder + '/' + docName + " - HR.png");
                if(destFile == null){return;}
                var doc = app.activeDocument;
                var artRect = doc.artboards[0].artboardRect;
                var exportOptions = new ImageCaptureOptions;
                exportOptions.resolution = 300;
                exportOptions.antiAliasing = true;
                exportOptions.transparency = true;
                doc.imageCapture(destFile, artRect, exportOptions);
            }
        }
    }
    
    function savePNG_LR(){
        var destFolder = Folder.selectDialog('Select the folder to export the PNG files to:');
        if (destFolder) {
            if(app.documents.length > 0){
                var docName = app.activeDocument.name.match(/^.*[^.ai]/i);
                var destFile = new File(destFolder + '/' + docName + " - LR.png");
                if(destFile == null){return;}
                var doc = app.activeDocument;
                var artRect = doc.artboards[0].artboardRect;
                var exportOptions = new ImageCaptureOptions;
                exportOptions.resolution = 72;
                exportOptions.antiAliasing = true;
                exportOptions.transparency = true;
                doc.imageCapture(destFile, artRect, exportOptions);
            }
        }
    }
    savePNG_HR();
    savePNG_LR();
    
  • I bought and use 6.1 Lightroom and Photoshop elements 14 on disks. If I go the road CC, the $19.99 per month Photoshop includes Lightroom?  It says "AN app." Photoshop and Lightroom are grouped in the $9.99 plan.

    I bought and use 6.1 Lightroom and Photoshop elements 14 on disks. If I go the road CC, the $19.99 per month Photoshop includes Lightroom?  It says "AN app." Photoshop and Lightroom are grouped in the $9.99 plan. But there is no mention of Lightroom as a separate application in the list of options for $ 19.99. A little puzzled. Is the extra $10.00 just for the 18 additional GB cloud storage?

    The Plan of Photoshop 19.99 includes Lightroom.  I believe the plan of 9.99 has a less busy version of Photoshop functionality or some limitation similar to what get it.

  • environment variable or registry from a photoshop script

    Is there a way to get the environment since a jsx photoshop script variable? (windows) or the registry

    Am interested in variable ProgramData (usually C:\programData) as they change in the registry.

    Thank you

    var s = .getenv ("ProgramData") $;

    Don't know how to get the registry entries.

    X

  • How the photoshop script can call an applescript script

    I realize, maybe it's a bit of a messy way around it, but I need to get the photoshop script to call an applescript script. Basically so that I can have it become a menu item in photoshop.

    Is - this show applescript can in the same way photoshop script?

    If this isn't the case, I thought I could get either photoshop script to call the applescript or even more messy, I could use Photoshop to run a Terminal command to call the applescript.

    All thoughts

    Matt

    For those who come through it

    Save your applescript as an application, and then you can use

    App.System ("' open ' / path/to/script_as_an_app.app'" ");

    then everything works

  • Simple (I guess) Photoshop scripts quesiton ;)

    Hi guys,.

    Just a quick question...

    I looked on the forum and on the web but cannot find a working solution for my, I think that simple problem.

    I have a Photoshop image using variables and external data source (text file) to generate badges with fields such as first_name, last_name, Department,... thanks to this tutorial http://www.richmediacs.com/user_manuals/RMCS_PS_Training/using%20ps%20Variables/UsingVaria blesInPS_EXTERNAL.html (maybe there is a better way to do the same things just scripted).

    This part works well but I would add a different logo only for certain Department so I need to use something like "If Department is accounting then show accounting logo of another if Department is engineering genius show another logo display the default logo.

    How can I do?

    I forgot to say I have this will be my first Photoshop script...

    Thank you for your help...

    Vince.

    With the graphic data and data sets, you have several choices. You may have several layers of logo and use the data to the control that is visible. I think this would be the best way. You can use the dataset object to replace the content of the logo layer. It works best if the logos are the same size. One of the people could be done with simple modifications to the matrix and data sets. You may post-process the images as suggests if you cannot change the data sets.

  • Photoshop elements 10 shot group crashes

    Photoshop Elements 10 - Shot Group crashes after I selected the option in the menu.  I use Windows XP.  Is there a workaround, or is there a way to fix this?

    I was able to fix this by resetting my preferences PSE10.  A BIG THANKS goes to mytaxsite.co.uk

  • Photoshop script output

    Is there a console or a log output of script event?  I tried to make a function that performs an alert correctly, but does not create a new document.  I can't find is it possible to see if this syntax is incorrect or the command is just outdated.

    In the code below, for example, I see the alert message, but no new document.  I don't see anyway to see what the problem with him and I pulled this line directly from the photoshop scripting guide.

    createDocument var = function() {}

    Alert ("create new doc!");

    App.Documents.Add (2.4);

    };

    IMHO, I don't think so. (I don't have none of that.)

    Maybe I understand you only hurts.

    The only thing you could do - own messages they close again by itself.

    Something like this:

    // CreateNewDocAndShowMessage.jsx
    // http://forums.adobe.com/thread/1237214?tstart=0
    // regards pixxxelschubser
    
    var Call;
    createDocument ();
    
    function createDocument () {
        Call = "creating new doc!";
        CallFunction ();
        app.documents.add (40,40);
        }
    function CallFunction () {
        win = new Window ("palette");
        win.someMessage= win.add ("statictext", undefined, Call);
        win.show();
        $.sleep(1500);
        win.close();
    }
    
  • How to add a color sample in a Photoshop script?

    Hello

    I would like to set a point of color sampler in a Photoshop script?

    Could you please help me on this.

    Thank you

    Rajiv.s

    var theSampler = app.activeDocument.colorSamplers.add([10,10]);

    Alert (theSampler.color.rgb.red + "_" + theSampler.color.rgb.green + "_" + theSampler.color.rgb.blue);

    Edit: And don't forget that a document can have only four ColorSamplers (from CS5 at least).

  • Adobe photoshop script exports data to CSV

    Hey guys,.

    Is it possible to export the data to a CSV with a script in photoshop. Right now we are running a script in photoshop which creates images of several products in a variety of color combinations. These images are exported to a local folder. Can another script run after the location name and image of the export file to a csv file? If this is not photoshop what if any program can do this.

    Thank you

    Jacob

    Have a look here graphic in Photoshop data-driven creation

  • How to create a group using photoshop scripts?

    Hey guys,.

    I can create a layer easily with the following code.

    But how do I create a group that contains more than one layer.

    docRef var = app.documents.add ();

    myLayer var = docRef.artLayers.add ();


    Here is an example...

    var doc = app.documents.add();
    var newLayerSet = doc.layerSets.add();
    var myLayer = doc.artLayers.add();
    var myLayer2 = doc.artLayers.add();
    //move the layers into the layerset
    myLayer.move(newLayerSet, ElementPlacement.INSIDE);
    myLayer2.move(newLayerSet, ElementPlacement.INSIDE);
    
  • HDR Photoshop script

    Hi, I would need your help. I want to customize this code it will automatically run when I launch immediately click OK plus. Thank you very much.

    #target photoshop
    
    /*********************************************************************
     Batch HDR Script by David Milligan
    *********************************************************************/
    
    /*********************************************************************
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    **********************************************************************/
    
    /*
    // BEGIN__HARVEST_EXCEPTION_ZSTRING
    
    <javascriptresource>
    <name>Batch HDR...</name>
    <menu>automate</menu>
    </javascriptresource>
    
    // END__HARVEST_EXCEPTION_ZSTRING
    */
    
    //these lines import the 'Merge To HDR.jsx' script that is built in to photoshop, we will make calls to that script and some of the scripts that it includes
    var runMergeToHDRFromScript = true;
    var g_ScriptFolderPath = app.path + "/"+ localize("$$$/ScriptingSupport/InstalledScripts=Presets/Scripts");
    var g_ScriptPath = File( g_ScriptFolderPath+'/Merge To HDR.jsx' );
    $.evalFile( g_ScriptPath ); 
    //$.level = 2;
    
    //default settings:
    mergeToHDR.useAlignment = true;
    mergeToHDR.useACRToning = false;
    var numberOfBrackets = 3;
    var userCanceled = false;
    var sourceFolder = new Folder('/d/Automata/LOADING');;
    var outputFolder = new Folder('/d/Automata/LOADING');;
    var saveType = "JPEG";
    var jpegQuality = 80;
    var progress;
    var statusText;
    var progressWindow;
    var fileMask = "*";
    var outputFilename = "hdr_output_";
    var zeroPadding = 2;
    
    var hdrRadius = 100;
    var hdrStrength = 0.5;
    var hdrGamma = 1.0;
    var hdrExposure = 0.0;
    var hdrDetail = 100;
    var hdrShadow = 0;
    var hdrHighlights = 0;
    var hdrVibrance = 20;
    var hdrSaturation = 30;
    var hdrSmooth = false;
    var hdrDeghosting = kMergeToHDRDeghostBest;//kMergeToHDRDeghostOff
    var hdrCurve = "0,0,255,255";
    var estTimeRemaining = "";
    
    var previewDoc;
    var originalDoc;
    
    function main()
    {
        promptUser();
        
        //make sure user didn't cancel
        if(sourceFolder != null && outputFolder != null && sourceFolder.exists && outputFolder.exists && numberOfBrackets > 0)
        {
            initializeProgress();
            var files =  sourceFolder.getFiles(fileMask);
            files.sort();
            var currentFileList = new Array();
    
            var numberOfFiles = files.length;
            
            if (numberOfFiles % 3 == 0)
            {
                numberOfBrackets = 3;
            }
            else
            {
                numberOfBrackets = 2;
            }
    
            /* convert numberOfFiles to a string to make sure zeropaddingis high enough to cover all files */
            
            var numberOfFilesStr = "" + (numberOfFiles / numberOfBrackets);
            if (zeroPadding > 0 && zeroPadding < numberOfFilesStr.length)
            {
                zeroPadding = numberOfFilesStr.length;
            }
    
            for(var index = 0;  index < numberOfFiles; index++)
            {
                if((index % numberOfBrackets) == numberOfBrackets - 1)
                {
                    var start = new Date();
                    progress.value = 100 * index / numberOfFiles;
                    currentFileList.push(files[index]);
                    if(userCanceled) break;
                    if(numberOfBrackets > 1)
                    {
                        statusText.text = "Merging files "+(index-numberOfBrackets+2)+" - "+(index+1)+" of "+numberOfFiles + estTimeRemaining;
                        //for braketed exposures use the mergeToHDR script to merge the files into a single 32 bit image
                        mergeToHDR.outputBitDepth= 32;
                        
                        mergeToHDR.mergeFilesToHDR( currentFileList, mergeToHDR.useAlignment, hdrDeghosting );
                        statusText.text = "Toning files "+(index-numberOfBrackets+2)+" - "+(index+1)+" of "+numberOfFiles+ estTimeRemaining;
                    }
                    else
                    {
                        statusText.text = "Loading file "+(index+1)+" of "+numberOfFiles+ estTimeRemaining;
                        //otherwise just open the file
                        doOpenFile(files[index]);
                        statusText.text = "Toning file "+(index+1)+" of "+numberOfFiles+ estTimeRemaining;
                    }
                    progress.value = 100 * (index + numberOfBrackets / 2 ) / numberOfFiles;
                    if(userCanceled) break;
                    try
                    {
                        if(app.activeDocument != null && outputBitDepth < 32)
                        {
                            //apply the actual tone mapping to the HDR image to get it back down to 8 bits
                            doHDRToning();
                        }
                    }
                    catch(error)
                    {
                        alert(error + "\nCheck number of files in source folder");
                        break;
                    }
                    
                    //save the result and close
                    //TODO: add leading zeros to index in filename
                    
                    if(numberOfBrackets > 1)
                    {
                        statusText.text = "Saving result "+(index-numberOfBrackets+2)+" - "+(index+1)+" of "+numberOfFiles+ estTimeRemaining;
                    }
                    else
                    {
                        statusText.text = "Saving result "+(index+1)+" of "+numberOfFiles+ estTimeRemaining;
                    }
                    if(userCanceled) break;
                    doSaveFile(outputFolder.absoluteURI + "/" + outputFilename + ZeroPad(Math.round((index + 1)/numberOfBrackets), zeroPadding) );
                    activeDocument.close(SaveOptions.DONOTSAVECHANGES);
                    
                    //reset our file list
                    currentFileList = new Array();
                    
                    //calculate time remaining
                    var end = new Date();
                    var timeElapsed = end.getTime() - start.getTime();
                    var mins = timeElapsed / 60000 * ((numberOfFiles - index - 1) / numberOfBrackets);
                    estTimeRemaining = " | Remaining: " + ZeroPad((mins / 60).toFixed(0),2) + ":" + ZeroPad((mins % 60).toFixed(0),2);
                }
                else
                {
                    currentFileList.push(files[index]);
                }
            }
            progressWindow.hide();
        }
    }
    
    function doOpenFile(filename)
    {
        
        const eventOpen = app.charIDToTypeID('Opn ');
        var desc = new ActionDescriptor();
        desc.putPath( typeNULL, new File( filename ) );
        desc.putBoolean( kpreferXMPFromACRStr, true ); //not sure what this does or if it is needed
        executeAction( eventOpen, desc, DialogModes.NO );
        //if we don't convert the image to 32bit the mergeToHDR script will not tone our image when we call it, it will simply downconvert it to 8 bit
        convertTo32Bit ();
    }
    
    function convertTo32Bit()
    {
        var idCnvM = charIDToTypeID( "CnvM" );
        var desc6 = new ActionDescriptor();
        var idDpth = charIDToTypeID( "Dpth" );
        desc6.putInteger( idDpth, 32 );
        var idMrge = charIDToTypeID( "Mrge" );
        desc6.putBoolean( idMrge, false );
        var idRstr = charIDToTypeID( "Rstr" );
        desc6.putBoolean( idRstr, false );
        executeAction( idCnvM, desc6, DialogModes.NO );
    }
    
    function doSaveFile(filename)
    {
        if(saveType == "JPEG")
        {
            var jpgSaveOptions = new JPEGSaveOptions();
            jpgSaveOptions.embedColorProfile = true;
            jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
            jpgSaveOptions.matte = MatteType.NONE;
            jpgSaveOptions.quality = jpegQuality;
            activeDocument.saveAs(new File(filename), jpgSaveOptions, true /*Save As Copy*/, Extension.LOWERCASE /*Append Extention*/);
        }
        else if(saveType == "TIFF")
        {
            var tifSaveOptions = new TiffSaveOptions();
            tifSaveOptions.embedColorProfile = true;
            activeDocument.saveAs(new File(filename), tifSaveOptions, true /*Save As Copy*/, Extension.LOWERCASE /*Append Extention*/);
        }
        else if(saveType == "TIFF LZW")
        {
            var tifSaveOptions = new TiffSaveOptions();
            tifSaveOptions.embedColorProfile = true;
            tifSaveOptions.imageCompression = TIFFEncoding.TIFFLZW;
            activeDocument.saveAs(new File(filename), tifSaveOptions, true /*Save As Copy*/, Extension.LOWERCASE /*Append Extention*/);
        }
        else if(saveType == "TIFF ZIP")
        {
            var tifSaveOptions = new TiffSaveOptions();
            tifSaveOptions.embedColorProfile = true;
            tifSaveOptions.imageCompression = TIFFEncoding.TIFFZIP;
            activeDocument.saveAs(new File(filename), tifSaveOptions, true /*Save As Copy*/, Extension.LOWERCASE /*Append Extention*/);
        }
        else
        {
            activeDocument.saveAs(new File(filename), undefined, true /*Save As Copy*/, Extension.LOWERCASE /*Append Extention*/);
        }
    }
    
    function doHDRToning()
    {
        //create the ActionDescriptor that describes the HDR toning settings to use
        var hdDesc = new ActionDescriptor;
        hdDesc.putInteger( stringIDToTypeID( 'version' ), 6 );//I'm not sure what this does
        hdDesc.putInteger(  kmethodStr, 3 );// the toning method to use, 3 = local adaptation
        hdDesc.putDouble( stringIDToTypeID( 'radius' ), hdrRadius );
        hdDesc.putDouble( stringIDToTypeID( 'threshold' ), hdrStrength );// strength
        hdDesc.putDouble( stringIDToTypeID( 'center' ), hdrGamma );// gamma
        hdDesc.putDouble( stringIDToTypeID( 'brightness' ), hdrExposure );// exposure
        hdDesc.putDouble( stringIDToTypeID( 'detail' ), hdrDetail );
        hdDesc.putDouble( stringIDToTypeID( 'shallow' ), hdrShadow );
        hdDesc.putDouble( stringIDToTypeID( 'highlights' ), hdrHighlights );
        hdDesc.putDouble( stringIDToTypeID( 'vibrance' ), hdrVibrance );
        hdDesc.putDouble( stringIDToTypeID( 'saturation' ), hdrSaturation);
        hdDesc.putBoolean( stringIDToTypeID( 'smooth' ), hdrSmooth );
        hdDesc.putBoolean( stringIDToTypeID( 'deghosting' ), hdrDeghosting );
        
        //create the tone curve
        var cDesc = new ActionDescriptor;
        cDesc.putString( stringIDToTypeID( 'name' ), 'Default');
        var cList = new ActionList;
        var points = hdrCurve.split(',');
        for(var i = 0; i < points.length; i++)
        {
            if(i % 2 == 1)
            {
                var pDesc = new ActionDescriptor;
                pDesc.putDouble( stringIDToTypeID( 'horizontal' ), points[i-1] );
                pDesc.putDouble( stringIDToTypeID( 'vertical' ), points[i] );
                pDesc.putBoolean( keyContinuity , false );// ?????
                cList.putObject( charIDToTypeID( 'Pnt ' ), pDesc );
            }
        }
        cDesc.putList( stringIDToTypeID( 'curve' ), cList );
        hdDesc.putObject( kclassContour, classShapingCurve, cDesc );
        
        //call the script that actually invokes the toning plugin
        convertFromHDRNoDialog( outputBitDepth, hdDesc );
    }
    
    function initializeProgress()
    {
        progressWindow = new Window("palette { text:'Meilleure Visite Chargement', \
            statusText: StaticText { text: 'Processing Images...', preferredSize: [350,20] }, \
            progressGroup: Group { \
                progress: Progressbar { minvalue: 0, maxvalue: 100, value: 0, preferredSize: [300,20] }, \
                cancelButton: Button { text: 'Cancel' } \
            } \
        }");
        statusText = progressWindow.statusText;
        progress = progressWindow.progressGroup.progress;
        progressWindow.progressGroup.cancelButton.onClick = function() { userCanceled = true; }
        progressWindow.show();
    }
    
    function promptUser()
    {
        var setupWindow = new Window("dialog { orientation: 'row', text: 'Meilleure Visite', alignChildren:'top', \
            leftGroup: Group { orientation: 'column', alignChildren:'fill', \
                inputPanel: Panel { text: 'Input', \
                    sourceGroup: Group { \
                    }, \
                    bracketGroup: Group{ \
                        bracketLabel: StaticText { text: 'Number of Brackets: ' }, \
                        bracketBox: EditText { characters: 2 }, \
                        filterLabel: StaticText { text: 'File Filter: ' }, \
                        filterText: EditText { characters: 5 }, \
                        alignCheckBox: Checkbox { text: 'Align' }\
                        deghostLabel: StaticText { text: 'Deghost: ' }\
                        deghostDropDown: DropDownList { }, \
                    } \
                }, \
                toningPanel: Panel { text: 'Toning', orientation:'row', alignChildren:'top' } ,\
                outputPanel: Panel { text: 'Output', \
                    outputGroup: Group { \
                        outputBox: EditText { characters: 10, text: '', enabled:false }, \
                    }, \
                    outputOptionsGroup: Group { \
                        outputFilenameLabel: StaticText { text: 'Filename Format: ' }, \
                        outputFilenameText: EditText { characters: 10 }, \
                    }, \
                    saveSettingsGroup: Group { \
                        saveTypeLabel: StaticText { text: 'Save As: ' }, \
                        saveDropDown: DropDownList { }, \
                        jpegQualityLabel: StaticText { text: 'JPEG Quality (1-10): ' }, \
                        jpegQualityText: EditText { characters: 2}, \
                        outputBitDepthLabel: StaticText { text: 'Bit Depth', enabled:false }, \
                        outputBitDepthDropDown: DropDownList { enabled:false }, \
                    } \
                } \
            }, \
            rightGroup: Group { orientation: 'column', alignChildren:'fill', \
                okButton: Button { text: 'OK', enabled: true } \
                cancelButton: Button { text: 'Cancel' } \
            } \
        } ");
        
        generateToningPanel(setupWindow.leftGroup.toningPanel);
        
        //shortcut variables
        var sourceBox = setupWindow.leftGroup.inputPanel.sourceGroup.sourceBox;
        var sourceBrowse = setupWindow.leftGroup.inputPanel.sourceGroup.sourceBrowse;
        var bracketBox = setupWindow.leftGroup.inputPanel.bracketGroup.bracketBox;
        var filterText = setupWindow.leftGroup.inputPanel.bracketGroup.filterText;
        var alignCheckBox = setupWindow.leftGroup.inputPanel.bracketGroup.alignCheckBox;
        var outputBox = setupWindow.leftGroup.outputPanel.outputGroup.outputBox;
        var outputFilenameText = setupWindow.leftGroup.outputPanel.outputOptionsGroup.outputFilenameText;
        var outputFilenamePost = setupWindow.leftGroup.outputPanel.outputOptionsGroup.outputFilenamePost;
        var saveDropDown = setupWindow.leftGroup.outputPanel.saveSettingsGroup.saveDropDown;
        var jpegQualityText = setupWindow.leftGroup.outputPanel.saveSettingsGroup.jpegQualityText;
        var jpegQualityLabel = setupWindow.leftGroup.outputPanel.saveSettingsGroup.jpegQualityLabel;
        var outputBitDepthDropDown = setupWindow.leftGroup.outputPanel.saveSettingsGroup.outputBitDepthDropDown;
        var outputBitDepthLabel = setupWindow.leftGroup.outputPanel.saveSettingsGroup.outputBitDepthLabel;
        var okButton = setupWindow.rightGroup.okButton;
        var cancelButton = setupWindow.rightGroup.cancelButton;
        var toningPanel = setupWindow.leftGroup.toningPanel;
        var deghostDropDown = setupWindow.leftGroup.inputPanel.bracketGroup.deghostDropDown;
        
        //set default values
        bracketBox.text = numberOfBrackets;
        filterText.text = fileMask;
        //mergeToHDR.useAlignment = true;
        alignCheckBox.value = mergeToHDR.useAlignment;
        outputFilenameText.text = outputFilename;
        jpegQualityText.text = jpegQuality;
        saveDropDown.add("item", "TIFF");
        saveDropDown.add("item", "JPEG");
        saveDropDown.add("item", "TIFF LZW");
        saveDropDown.add("item", "TIFF ZIP");
        saveDropDown.selection = 0;
        outputBitDepthDropDown.add("item", "8");
        outputBitDepthDropDown.add("item", "16");
        outputBitDepthDropDown.add("item", "32");
        outputBitDepthDropDown.selection = 0;
        
        var generateDeghostDropDownList = function(count)
        {
            deghostDropDown.removeAll()
            deghostDropDown.add("item", "Best");
            deghostDropDown.add("item", "Off");
            for(var i = 0; i < count; i++)
            {
                deghostDropDown.add("item", i);
            }
            deghostDropDown.selection = 0;
        }
        generateDeghostDropDownList(numberOfBrackets);
        
        //event handlers
        bracketBox.onChange = function()
        { 
            numberOfBrackets = bracketBox.text;
            generateDeghostDropDownList(numberOfBrackets);
        };
        filterText.onChange = function() { fileMask = filterText.text; };
        alignCheckBox.onClick = function() { mergeToHDR.useAlignment = alignCheckBox.value; };
        deghostDropDown.onChange = function() 
        { 
            if(this.selection.text == "Best") 
                hdrDeghosting = kMergeToHDRDeghostBest;
            else if(this.selection.text == "Off")
                hdrDeghosting = kMergeToHDRDeghostOff;
            else
                hdrDeghosting = Number(this.selection.text);
                
        };
        outputBox.onChange = function()
        {
            outputFolder = new Folder(outputBox.text);
            okButton.enabled = sourceFolder != null && outputFolder != null && sourceFolder.exists && outputFolder.exists;
        };
        outputFilenameText.onChange = function() { outputFilename = outputFilenameText.text; };
    
        saveDropDown.onChange = function()
        {
            saveType = saveDropDown.selection.text;
            jpegQualityText.enabled = saveDropDown.selection.text == "JPEG";
            jpegQualityLabel.enabled = saveDropDown.selection.text == "JPEG";
            if(saveDropDown.selection.text == "JPEG")
            {
                outputBitDepthDropDown.selection = 0;
            }
            outputBitDepthDropDown.enabled = saveDropDown.selection.text != "JPEG" && saveDropDown.selection.text != "Radiance" && saveDropDown.selection.text != "OpenEXR";
            outputBitDepthLabel.enabled = outputBitDepthDropDown.enabled;
            
        };
        jpegQualityText.onChange = function() { jpegQuality = jpegQualityText.text; };
        outputBitDepthDropDown.onChange = function()
        { 
            outputBitDepth = outputBitDepthDropDown.selection.text; 
            toningPanel.enabled = outputBitDepth != 32;
        }
        okButton.onClick = function() { setupWindow.hide(); cleanUpPreviews(); };
        cancelButton.onClick = function() { sourceFolder = null, setupWindow.hide(); cleanUpPreviews(); };
        
        saveDropDown.onChange();
        outputBitDepthDropDown.onChange();
        
        setupWindow.show();
    }
    
    function cleanUpPreviews()
    {
        if(originalDoc != null)
        {
            originalDoc.close(SaveOptions.DONOTSAVECHANGES);
            originalDoc = null;
        }
        if(previewDoc != null)
        {
            previewDoc.close(SaveOptions.DONOTSAVECHANGES);
            previewDoc = null;
        }
    }
    
    function generateToningPanel(toningPanel)
    {
        var leftToningGroup = toningPanel.add("group{orientation:'column',alignChildren:'fill'}");
        var rightToningGroup = toningPanel.add("group{orientation:'column',alignChildren:'fill'}");
        var presetGroup = leftToningGroup.add("group{orientation:'row'}");
        var presetDropDown = presetGroup.add("dropdownlist");
        var loadPresetButton = presetGroup.add("button", undefined, "Load Preset");
        var edgePanel = leftToningGroup.add("panel",undefined,"Edge Glow");
        var radiusSlider = createSliderControl(edgePanel.add("group"), "  Radius: ", "px", 0, 500, 0, hdrRadius, function(newValue){ hdrRadius = newValue; });
        var strengthSlider = createSliderControl(edgePanel.add("group"), "Strength: ", "", 0, 4.0, 2, hdrStrength, function(newValue){ hdrStrength = newValue; });
        var edgeGroup = edgePanel.add("group");
        var smoothEdgesBox = edgeGroup.add("checkbox",undefined, "Smooth Edges");
        var detailPanel = leftToningGroup.add("panel",undefined,"Tone and Detail");
        var gammaSlider = createSliderControl(detailPanel.add("group"), "  Gamma: ", "", 0.1, 2.0, 2, hdrGamma, function(newValue){ hdrGamma = newValue; });
        var exposureSlider = createSliderControl(detailPanel.add("group"), "Exposure: ", "", -5.0, 5.0, 2, hdrExposure, function(newValue){ hdrExposure = newValue; });
        var detailSlider = createSliderControl(detailPanel.add("group"), "     Detail: ", "%", -300, 300, 0, hdrDetail, function(newValue){ hdrDetail = newValue; });
        var advancedPanel = leftToningGroup.add("panel",undefined,"Advanced");
        var shadowSlider = createSliderControl(advancedPanel.add("group"), "  Shadow: ", "%", -100, 100, 0, hdrShadow, function(newValue){ hdrShadow = newValue; });
        var highlightSlider = createSliderControl(advancedPanel.add("group"), " Highlight: ", "%",  -100, 100, 0, hdrHighlights, function(newValue){ hdrHighlights = newValue; });
        var vibranceSlider = createSliderControl(advancedPanel.add("group"), "  Vibrance: ", "%",  -100, 100, 0, hdrVibrance, function(newValue){ hdrVibrance = newValue; });
        var saturationSlider = createSliderControl(advancedPanel.add("group"), "Saturation: ", "%",  -100, 100, 0, hdrSaturation, function(newValue){ hdrSaturation = newValue; });
        var toningCurvePanel = leftToningGroup.add("panel{text:'Toning Curve',alignChildren:'fill'}");
        var curveBox = toningCurvePanel.add("edittext", undefined, hdrCurve);
        
        //default values
        smoothEdgesBox.value = hdrSmooth;
        var presetFiles = getPresetFiles();
        var updateSliders = function()
        {
            radiusSlider(hdrRadius);
            strengthSlider(hdrStrength);
            smoothEdgesBox.value = hdrSmooth;
            exposureSlider(hdrExposure);
            gammaSlider(hdrGamma);
            detailSlider(hdrDetail);
            shadowSlider(hdrShadow);
            highlightSlider(hdrHighlights);
            vibranceSlider(hdrVibrance);
            saturationSlider(hdrSaturation);
            curveBox.text = hdrCurve;
        }
        if(presetFiles.length > 0)
        {
            for(var f in presetFiles)
            {
                presetDropDown.add("item", presetFiles[f].displayName.replace(".hdt",""));
            }
            presetDropDown.selection = 0;
            loadPreset(presetFiles[0]);
            presetDropDown.onChange = function()
            {
                loadPreset(presetFiles[presetDropDown.selection.index]);
                updateSliders();
            };
        }
        
        //event handlers
        loadPresetButton.onClick = function()
        {
            loadPreset(null);
            updateSliders();
        };
        smoothEdgesBox.onClick = function () { hdrSmooth = smoothEdgesBox.value; };
        curveBox.onChange = function () { hdrCurve = curveBox.text; };
        
        updateSliders();
    }
    
    
    function createSliderControl(group,label,postLabel,min,max,round,value,onValueChanged)
    {
        var ignoreChange = false;
        group.add("statictext", undefined, label);
        var slider = group.add("slider",undefined,value,min,max);
        slider.alignment = "fill";
        var box = group.add("edittext",undefined,value);
        box.characters = 6;
        group.add("statictext", undefined, postLabel);
        slider.onChange = function()
        {
            if(!ignoreChange)
            {
                ignoreChange = true;
                box.text = slider.value.toFixed(round);
                onValueChanged(slider.value);
                ignoreChange = false;
            }
        };
        box.onChange = function()
        {
            if(!ignoreChange)
            {
                ignoreChange = true;
                slider.value = box.text;
                onValueChanged(box.text);
                ignoreChange = false;
            }
        };
        return function(newValue)
        {
            slider.value = newValue;
            box.text = newValue.toFixed(round);
        };
    }
    
    //forces a redraw while a script dialog is active (for preview)
    var waitForRedraw = function()
    {
        var desc = new ActionDescriptor();
        desc.putEnumerated(charIDToTypeID("Stte"), charIDToTypeID("Stte"), charIDToTypeID("RdCm"));
        executeAction(charIDToTypeID("Wait"), desc, DialogModes.NO);
    }
    
    function getZoomLevel()
    {
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
        var desc = executeActionGet(ref);
        return Number(desc.getDouble(stringIDToTypeID('zoom'))*100).toFixed(1);
    }
    
    function setZoomLevel( zoom )
    {
        if(zoom < 1 ) zoom =1;
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID("capp"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
        var getScrRes = executeActionGet(ref).getObjectValue(stringIDToTypeID('unitsPrefs')).getUnitDoubleValue(stringIDToTypeID('newDocPresetScreenResolution'))/72;
        var docRes = activeDocument.resolution;
        activeDocument.resizeImage( undefined, undefined, getScrRes/(zoom/100), ResampleMethod.NONE );
        var desc = new ActionDescriptor();
        ref = null;
        ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID( "Mn  " ), charIDToTypeID( "MnIt" ), charIDToTypeID( 'PrnS' ) );
        desc.putReference( charIDToTypeID( "null" ), ref );
        executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
        activeDocument.resizeImage( undefined, undefined, docRes, ResampleMethod.NONE );
    }
    
    function ZeroPad(number,numZeros)
    {
        var result = number.toString();
        while(result.length < numZeros)
        {
            result = "0" + result;
        }
        return result;
    }
    
    var getPresetFiles = function()
    {
        var presetFolder = new Folder(app.path + "/Presets/HDR Toning");
        return presetFolder.getFiles("*.hdt");
    }
    
    var loadPreset = function(presetFile)
    {
        if(presetFile == null)
        {
            presetFile = File.openDialog("Select Preset","*.hdt");
        }
        if(presetFile != null)
        {
            var tmpStr = new String();
            var binaryData = new Array();
            presetFile.encoding = "BINARY";
            presetFile.open('r');
            while(!presetFile.eof)
            {
                var ch = presetFile.readch();
                if ( ch.charCodeAt(0) == 0 ){
                    tmpStr += ' ';
                }
                else {
                    tmpStr += ch;
                }
                binaryData.push(ch.charCodeAt(0));
            }
            presetFile.close();
            if(binaryData.length >= 40)
            {
                // init start position for reading datas
                // start position for english version ( string "D e f a u l t" is in the preset file )
                var startPos = 38;
                if ( tmpStr.search ("P a r   d é f a u t") > -1 ){
                    // start position for french preset file version ( string "P a r   d é f a u t" is in the preset file ) (==> + 6 bytes)
                    startPos = 44;
                }
                // if your preset file can't be read, try this : open it in notepad to see the string "D e f a u l t" in your language and add the code here to set startPos to 38 + diff between the length of ("D e f a u l t") and length of ("D e f a u l t" in your language)
                var curvePointCount = getUInt16(binaryData, startPos);
                if(binaryData.length >= 104 + curvePointCount * 4)
                {
                    var curvePointStr = "";
                    for(var i = 0; i < curvePointCount; i++)
                    {
                        curvePointStr += getUInt16(binaryData, startPos + 4 + i * 4) + "," + getUInt16(binaryData, startPos + 2 + i * 4) + ((i < curvePointCount - 1) ? "," : "");
                    }
                    hdrCurve = curvePointStr;
                    
                    hdrStrength =  getFloat32(binaryData,8);
                    hdrRadius = getFloat32(binaryData, startPos + 10 + 5 * curvePointCount);
                    hdrExposure = getFloat32(binaryData, startPos + 34 + 5 * curvePointCount);
                    hdrSaturation = getFloat32(binaryData, startPos + 38 + 5 * curvePointCount);
                    hdrDetail = getFloat32(binaryData, startPos + 42 + 5 * curvePointCount);
                    hdrShadow = getFloat32(binaryData, startPos + 46 + 5 * curvePointCount);
                    hdrHighlights = getFloat32(binaryData, startPos + 50 + 5 * curvePointCount);
                    hdrGamma = getFloat32(binaryData, startPos + 54 + 5 * curvePointCount);
                    hdrVibrance = getFloat32(binaryData, startPos + 58 + 5 * curvePointCount);
                    hdrSmooth = getUInt16(binaryData, startPos + 62 + 5 * curvePointCount) != 0;
                }
                else
                {
                    alert("Error Loading File", "Error", true);
                }
            }
            else
            {
                alert("Error Loading File", "Error", true);
            }
        }
    }
    
    function getUInt16(byteArray,offset)
    {
        return byteArray[offset] * 0x100 + byteArray[offset + 1];
    }
    
    function getUInt32(byteArray,offset)
    {
        return byteArray[offset] * 0x1000000 + byteArray[offset + 1] * 0x10000 + byteArray[offset + 2] * 0x100 + byteArray[offset + 3];
    }
    
    function getFloat32(byteArray,offset)
    {
        var bytes = getUInt32(byteArray,offset);
        var sign = (bytes & 0x80000000) ? -1 : 1;
        var exponent = ((bytes >> 23) & 0xFF) - 127;
        var significand = (bytes & ~(-1 << 23));
        
        if (exponent == 128)
            return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);
        
        if (exponent == -127) {
            if (significand == 0) return sign * 0.0;
            exponent = -126;
            significand /= (1 << 22);
        } else significand = (significand | (1 << 23)) / (1 << 23);
        
        return sign * significand * Math.pow(2, exponent);
    }
    
    main();
    
    

    I do not support exhibitions in order to perform processing HDR.   I don't want to create HDR images. The EXIF data does not have an EV adjustment. You can calculate EV information EXIF information.  Should the process of HDR data EXIF to calculate EV your image file need to have then the metadata.  Your script can be able to be something for the HDR script, I have no idea what the deghostFlag is all. Maybe if you examine the code in the script of David Milligan you can very well how to use the HDR script from another script.

  • Photoshop CC 2015: "export under" does not - export as extension could not be loaded because it was not duly signed

    "Export as an extension could not be loaded because it was not properly signed.

    I get this popup error when you select file > export > export under... and also when right click on a layer to ' export as. I tried with layers, work plans, groups, images, nothing works. The "quick export" and "save for web (legacy)" still works well, but since I'm assuming that it will be removed I would really like to get this working...

    Don't know if this has anything to do with it, but I enabled "generator" in Preferences > plugins and also "generate image assets' seems to work very well.


    I tried to google and search on the Adobe forum, but I was not able to find a solution to this problem. I'm fine with technical details...


    I am running the latest version of Photoshop CC 2015 (2015.0.1 version) on:

    MacBook Pro (retina, 15 inch, mid-2015)

    OS X Yosemite, 10.10.5

    Looks like that some files used by export as had changed after the installation, initial, so upgrade is not put to update these files.

    Please try:
    1. Uninstall Photoshop

    2 check files listed below and if these files are not removed by uninstall, delete or move them to another location

    / Library/Application Support/Adobe/CEP/extensions/com.adobe.webpa.crema

    (Installation of Photoshop path) /Adobe Photoshop 2015/Adobe Photoshop 2015.app/Contents/Required/Plug-Ins/Generator/assets.generate CC CC

    3. install Photoshop

Maybe you are looking for