Skip to main content
angadarora
Participant
January 14, 2019
Answered

C# Simple Select/Get Layer by Name

  • January 14, 2019
  • 1 reply
  • 2834 views

Hi i just want to select a layer using its name, it is possible using JS, VBA but i am unable to find a similar solution for Visual basic C#.

Also if possible where can i find a full list of Methods and functions available in C# object library like this com.adobe.photoshop.ArtLayer

using System;

using System.Runtime.InteropServices;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using MintCorePS;

using ps = Photoshop;

using K = PhotoshopTypeLibrary.PSConstants;

namespace Core

{

    class Program

    {

        static void Main(string[] args)

        {

            //Initiate Photoshop

            ps.ApplicationClass App = new ps.ApplicationClass();

            ps.ActionDescriptorClass AppAction = new ps.ActionDescriptorClass();

            var Layer = App.ActiveDocument.ArtLayers.getLayerByName("Core");

        }

    }

}

Thank you in advance.

This topic has been closed for replies.
Correct answer SuperMerlin

using System;

namespace PhotoshopTest

{

    class Program

    {

        static void Main(string[] args)

        {

            dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"));

            app.Visible = true;

            app.ActiveDocument.ActiveLayer = app.ActiveDocument.ArtLayers.GetByName("Core");

        }

    }

}

1 reply

SuperMerlin
SuperMerlinCorrect answer
Inspiring
January 14, 2019

using System;

namespace PhotoshopTest

{

    class Program

    {

        static void Main(string[] args)

        {

            dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"));

            app.Visible = true;

            app.ActiveDocument.ActiveLayer = app.ActiveDocument.ArtLayers.GetByName("Core");

        }

    }

}

angadarora
Participant
January 14, 2019

Thank you. It seems to work your way, but if possible can you tell me the difference in our approaches i mean why isnt GetByName available the way i am doing it?

SuperMerlin
Inspiring
January 14, 2019

Is there any documentation so that i can know what all commands are available ?


The nearest documentation would be in the SDK Adobe Photoshop SDK

In there you will find the documentation for JavaScript and is the same commands but with the first character in uppercase.

You can also create functions from the scriptlistener output.

Here are a few examples:-

static void duplicate( dynamic app )

{

dynamic ad = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ar = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

dynamic ar2 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ar.PutClass( app.CharIDToTypeID( "Dcmn" ));

ad.PutReference( app.CharIDToTypeID( "null" ), ar );

ad.PutString( app.CharIDToTypeID( "Nm  " ), "temp" );

ar2.PutEnumerated( app.CharIDToTypeID( "Lyr " ), app.CharIDToTypeID( "Ordn" ), app.CharIDToTypeID( "Trgt" ));

ad.PutReference( app.CharIDToTypeID( "Usng" ), ar2 );

ad.PutInteger( app.CharIDToTypeID( "Vrsn" ), 5 );

app.ExecuteAction( app.CharIDToTypeID( "Mk  " ), ad, 3 );

}

static void vectorMaskHideAll( dynamic app )

{

dynamic ad = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ar = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

dynamic ar2 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ar.PutClass( app.CharIDToTypeID( "Path" ));

ad.PutReference( app.CharIDToTypeID( "null" ), ar );

ar2.PutEnumerated( app.CharIDToTypeID( "Path" ), app.CharIDToTypeID( "Path" ), app.StringIDToTypeID( "vectorMask" ));

ad.PutReference( app.CharIDToTypeID( "At  " ), ar2 );

ad.PutEnumerated( app.CharIDToTypeID( "Usng" ), app.StringIDToTypeID( "vectorMaskEnabled" ), app.CharIDToTypeID( "HdAl" ));

app.ExecuteAction( app.CharIDToTypeID( "Mk  " ), ad, 3 );

}

static void makeUserMaskRevealAll( dynamic app )

{

dynamic ad = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ar = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ad.PutClass( app.CharIDToTypeID( "Nw  " ), app.CharIDToTypeID( "Chnl" ));

ar.PutEnumerated( app.CharIDToTypeID( "Chnl" ), app.CharIDToTypeID( "Chnl" ), app.CharIDToTypeID( "Msk " ));

ad.PutReference( app.CharIDToTypeID( "At  " ), ar );

ad.PutEnumerated( app.CharIDToTypeID( "Usng" ), app.CharIDToTypeID( "UsrM" ), app.CharIDToTypeID( "RvlA" ));

app.ExecuteAction( app.CharIDToTypeID( "Mk  " ), ad, 3 );

}

static void deleteLayer(dynamic app)

{

dynamic desc338 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref235 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref235.PutEnumerated( app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

desc338.PutReference( app.CharIDToTypeID("null"), ref235 );

app.ExecuteAction( app.CharIDToTypeID("Dlt "), desc338, 3 );

}

static Boolean hasUserMask(dynamic app)

{

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref1.PutEnumerated( app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

return app.ExecuteActionGet( ref1 ).getBoolean( app.StringIDToTypeID( "hasUserMask" ) );

}   

static void selectLayerByID(int ID, dynamic app)

{

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref1.PutIdentifier(app.CharIDToTypeID("Lyr "), ID);

dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

desc.Putreference(app.CharIDToTypeID("null"), ref1);

desc.PutBoolean(app.CharIDToTypeID("MkVs"), false);

app.ExecuteAction(app.CharIDToTypeID("slct"), desc, 3);

}

static void unSelectMask(dynamic app)

{

dynamic desc28 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref14 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref14.PutEnumerated( app.CharIDToTypeID("Chnl"), app.CharIDToTypeID("Chnl"), app.CharIDToTypeID("RGB ") );

desc28.PutReference( app.CharIDToTypeID("null"), ref14 );

desc28.PutBoolean( app.CharIDToTypeID("MkVs"), false );

app.ExecuteAction( app.CharIDToTypeID("slct"), desc28, 3 );

}

static void pasteStyle(ynamic app)

{

app.eExecuteAction( CharIDToTypeID( "PaFX" ), unull,3 );

}

static Boolean hasFX(dynamic app)

{

try{

app.ExecuteAction(CharIDToTypeID( "CpFX" ), null, 3 );

return true;

}catch(Exception){return false;}

}

static void selectLayerMask(dynamic app)

{

dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref1.PutEnumerated( app.CharIDToTypeID( "Chnl" ), app.CharIDToTypeID( "Chnl" ), app.CharIDToTypeID( "Msk " ) );

ref1.PutEnumerated( app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

desc.PutReference( CharIDToTypeID( "null" ), ref1 );

desc.PutBoolean( CharIDToTypeID( "MkVs" ), false );

app.ExecuteAction( CharIDToTypeID( "slct" ), desc, 3 );

}

static void freeTransform(dynamic app)

{

dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

ref1.PutEnumerated( app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

desc.Putreference( app.CharIDToTypeID("null"), ref1 );

desc.PutEnumerated( app.CharIDToTypeID("FTcs"), app.CharIDToTypeID("QCSt"), app.CharIDToTypeID("Qcsa") );

dynamic ldesc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

ldesc.PutUnitDouble( app.CharIDToTypeID("Hrzn"), app.CharIDToTypeID("#Pxl"), 0.00001 );

ldesc.PutUnitDouble( app.CharIDToTypeID("Vrtc"), app.CharIDToTypeID("#Pxl"), 0.00001 );

desc.PutObject( app.CharIDToTypeID("Ofst"), app.CharIDToTypeID("Ofst"), ldesc );

desc.PutUnitDouble( app.CharIDToTypeID("Wdth"), app.CharIDToTypeID("#Prc"),100.0000 );

desc.PutUnitDouble( app.CharIDToTypeID("Hght"), app.CharIDToTypeID("#Prc"), 100.0000 );

app.ExecuteAction( app.CharIDToTypeID("Trnf"), desc, 1 );

}

static void hideFX(Boolean Visible, dynamic app)

{

dynamic desc172 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref97 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref97.PutProperty( app.CharIDToTypeID("Prpr"), app.CharIDToTypeID("lfxv") );

ref97.PutEnumerated( app.CharIDToTypeID("Dcmn"), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

desc172.PutReference( app.CharIDToTypeID("null"), ref97 );

dynamic desc173 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

desc173.PutBoolean( app.CharIDToTypeID("lfxv"), Visible );

desc172.PutObject( app.CharIDToTypeID("T   "), app.CharIDToTypeID("lfxv"), desc173 );

app.ExecuteAction( app.CharIDToTypeID("setd"), desc172, 3 );   

}

static void waitForRedraw(dynamic app)

{

dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

desc.PutEnumerated(app.CharIDToTypeID("Stte"), app.CharIDToTypeID("Stte"), app.CharIDToTypeID("RdCm"));

app.ExecuteAction(app.CharIDToTypeID("Wait"), desc, 3);

}

static void linkLayer(dynamic app)

{

dynamic desc460 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ref42 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

ref42.PutEnumerated( app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt") );

desc460.PutReference( app.CharIDToTypeID("null"), ref42 );

dynamic desc461 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

desc461.PutBoolean( app.CharIDToTypeID("Usrs"), true );

desc460.PutObject( app.CharIDToTypeID("T   "), app.CharIDToTypeID("Lyr "), desc461 );

app.ExecuteAction( app.CharIDToTypeID("setd"), desc460, 3 );

}

static int getLayerID(dynamic app)

{

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

ref1.PutEnumerated( app.CharIDToTypeID("Lyr "),app.CharIDToTypeID("Ordn"),app.CharIDToTypeID("Trgt") );

var desc = app.ExecuteActionGet(ref1);

return desc.getInteger(app.StringIDToTypeID( "layerID" ));

}

static int getLayerID(int idx,dynamic app)

{

dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

ref1.PutIndex(app.CharIDToTypeID("Lyr "), idx);

return app.ExecuteActionGet(ref1).GetInteger(app.StringIDToTypeID("layerID"));

}

static double[] getBoundsByID(int ID,dynamic app)

        {

             dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

            ref1.PutIdentifier(app.CharIDToTypeID('Lyr '), ID);

            dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

            desc = app.ExecuteActionGet(ref1).GetObjectValue(app.StringIDToTypeID("bounds"));

            double[] bounds = new double[4];

            bounds[0] = desc.GetUnitDoubleValue(app.StringIDToTypeID("left"));

            bounds[1] = desc.GetUnitDoubleValue(app.StringIDToTypeID("top"));

            bounds[2] = desc.GetUnitDoubleValue(app.StringIDToTypeID("right"));

            bounds[3] = desc.GetUnitDoubleValue(app.StringIDToTypeID("bottom"));

            return bounds;

        }

double[] result = getBounds(app); //get bounds of layer

static double[] getBounds( dynamic app)

        {

            dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

            ref1.PutEnumerated(app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt"));

            dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

            desc = app.ExecuteActionGet(ref1).GetObjectValue(app.StringIDToTypeID("bounds"));

            double[] bounds = new double[4];

            bounds[0] = desc.GetUnitDoubleValue(app.StringIDToTypeID("left"));

            bounds[1] = desc.GetUnitDoubleValue(app.StringIDToTypeID("top"));

            bounds[2] = desc.GetUnitDoubleValue(app.StringIDToTypeID("right"));

            bounds[3] = desc.GetUnitDoubleValue(app.StringIDToTypeID("bottom"));

            return bounds;

        }

static void selectLayerByID(int ID, Boolean add,dynamic app)

        {

            dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

            ref1.PutIdentifier(app.CharIDToTypeID("Lyr "), ID);

            dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

            desc.PutReference(app.CharIDToTypeID("null"), ref1);

            if (add) desc.PutEnumerated(app.StringIDToTypeID("selectionModifier"), app.StringIDToTypeID("selectionModifierType"), app.StringIDToTypeID("addToSelection"));

            desc.PutBoolean(app.CharIDToTypeID("MkVs"), false);

            try

            {

                app.ExecuteAction(app.CharIDToTypeID("slct"), desc, 3);

            }

            catch (Exception) { }

        }

static void selectLayerByIndex(int index, Boolean add, dynamic app)

        {

            dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Actionreference"));

            ref1.PutIndex(app.CharIDToTypeID("Lyr "), index);

            dynamic desc = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

            desc.PutReference(app.CharIDToTypeID("null"), ref1);

            if (add) desc.PutEnumerated(app.StringIDToTypeID("selectionModifier"), app.StringIDToTypeID("selectionModifierType"), app.StringIDToTypeID("addToSelection"));

            desc.PutBoolean(app.CharIDToTypeID("MkVs"), false);

            try

            {

                app.ExecuteAction(app.CharIDToTypeID("slct"), desc, 3);

            }

            catch (Exception) { }

        }

    int[] selLayers = getSelectedLayersIdx(app);

        /////////

        /// <summary>

        /// Returns an array of selected layers Indexs.

        /// </summary>

        /// <param name="app"></param>

        /// <returns></returns>

        static int[] getSelectedLayersIdx(dynamic app)

        {

            ArrayList selectedLayers = new ArrayList();

            dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

            ref1.PutProperty(app.CharIDToTypeID("Prpr"), stringIDToTypeID("targetLayers"));

            ref1.PutEnumerated(app.CharIDToTypeID("Dcmn"), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt"));

            var desc = app.ExecuteActionGet(ref1);

            if (desc.HasKey(app.StringIDToTypeID("targetLayers")))

            {

                desc = desc.GetList(app.StringIDToTypeID("targetLayers"));

                int c = desc.Count;

                for (var i = 0; i < c; i++)

                {

                    if (app.ActiveDocument.Layers[app.ActiveDocument.Layers.Count].isBackgroundLayer)

                    {

                        selectedLayers.Add(desc.GetReference(i).GetIndex());

                    }

                    else {

                        selectedLayers.Add(desc.GetReference(i).GetIndex() + 1);

                    }

                }

            }

            else

            {

                dynamic ref2 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

                ref2.PutProperty(app.CharIDToTypeID("Prpr"), app.CharIDToTypeID("ItmI"));

                ref2.PutEnumerated(app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt"));

                if (app.ActiveDocument.Layers[app.ActiveDocument.Layers.Count].isBackgroundLayer)

                {

                    selectedLayers.Add(app.ExecuteActionGet(ref2).getInteger(app.CharIDToTypeID("ItmI")) - 1);

                }

                else

                {

                    selectedLayers.Add(app.ExecuteActionGet(ref2).getInteger(app.CharIDToTypeID("ItmI")));

                }

                bool vis = app.ActiveDocument.ActiveLayer.Visible;

                if (vis) app.ActiveDocument.ActiveLayer.Visible = false;

                dynamic desc9 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

                dynamic list9 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionList"));

                dynamic ref9 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

                ref9.PutEnumerated(app.CharIDToTypeID("Lyr "), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt"));

                list9.PutReference(ref9);

                desc9.PutList(app.CharIDToTypeID("null"), list9);

                app.ExecuteAction(app.CharIDToTypeID("Shw "), desc9, 3);

                if (app.ActiveDocument.ActiveLayer.Visible == false) selectedLayers.RemoveAt(0);

                app.ActiveDocument.ActiveLayer.Visible = vis;

            }

            int[] sLayers = (int[])selectedLayers.ToArray(typeof(int));

            return sLayers;

        }

/////////////////////////////////////////

var layerInfo = getNamesPlusIDs(app);

            for (int x = 0; x < layerInfo.Count; x++)

            {

                Console.WriteLine(

                   "Layer name = " + layerInfo.Item1 +

                   " Index = " + layerInfo.Item2 +

                   " Layer ID = " + layerInfo.Item3 +

                   " Is Layerset = " + layerInfo.Item4

                   );

              }

                   Console.ReadLine();

/////////////////////////////////////////////////////

        /// <summary>

        /// Returns a Tuple:- LayerName,Index,Layer ID,is LayerSet

        /// </summary>

        /// <param name="app"></param>

        /// <returns></returns>

        static List<Tuple<string, int, int, bool>> getNamesPlusIDs(dynamic app)

        {

            int z = 0;

            List<Tuple<string, int, int, bool>> Dat = new List<Tuple<string, int, int, bool>>();

            dynamic ref1 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

            ref1.PutProperty(app.CharIDToTypeID("Prpr"), app.CharIDToTypeID("NmbL"));

            ref1.PutEnumerated(app.CharIDToTypeID("Dcmn"), app.CharIDToTypeID("Ordn"), app.CharIDToTypeID("Trgt"));

            int count = app.ExecuteActionGet(ref1).getInteger(app.CharIDToTypeID("NmbL")) + 1;

            if (app.ActiveDocument.Layers[app.ActiveDocument.Layers.Count].isBackgroundLayer)

            {

                z = 0;

            }

            else {

                z = 1;

            }

            for (int i = z; i < count; i++)

            {

                if (i == 0) continue;

                dynamic ref2 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

                ref2.PutIndex(app.CharIDToTypeID("Lyr "), i);

                var desc = app.ExecuteActionGet(ref2);

                string layerName = desc.getString(app.CharIDToTypeID("Nm  "));

                int ID = desc.getInteger(app.StringIDToTypeID("layerID"));

                Match m = Regex.Match(layerName, "Layer group");

                if (m.Success) continue;

                string layerType = app.TypeIDToStringID(desc.GetEnumerationValue(app.StringIDToTypeID("layerSection")));

                bool isLayerSet = (layerType == "layerSectionContent") ? false : true;

                Dat.Add(new Tuple<string, int, int, bool>(layerName, i, ID, isLayerSet));

            }

            return Dat;

        }

////////////////////////////////////////////////

                string fileName = app.ActiveDocument.FullName;

                string aPath = app.Path;

                string path = Path.GetDirectoryName(fileName);

                string ext = Path.GetExtension(fileName);

                string fName = Path.GetFileNameWithoutExtension(fileName);

                string root = Path.GetPathRoot(fileName);

                string lastDir = Path.GetFileNameWithoutExtension(path);

                fileName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/" + fName + ".psd";

                savePSD(app, fileName);

                string sFile = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/" + fName + ".jpg";

                SaveForWeb(app, sFile, 80);

private static void savePSD(dynamic app, string saveFile)

        {

            dynamic psdOpts = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.PhotoshopSaveOptions"));

            psdOpts.embedColorProfile = true;

            psdOpts.alphaChannels = true;

            psdOpts.layers = true;

            app.ActiveDocument.SaveAs(saveFile, psdOpts, true, 2); //2= lowercase

        }

static void SaveJPG( dynamic app, string saveFile, int quality)

{

    dynamic jpgOpts = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.JPEGSaveOptions"));

            jpgOpts.embedColorProfile = true;

            jpgOpts.formatOptions = 1 /* FormatOptions.STANDARDBASELINE*/;

            jpgOpts.matte = 1 /*MatteType.NONE*/;

            jpgOpts.quality = quality; //1-12

            app.ActiveDocument.SaveAs(saveFile, jpgOpts, true, 2); //2= lowercase

}

static void SaveRaw( dynamic app, string saveFile)

{

    dynamic rawSaveOptions = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.RawSaveOptions"));

    app.ActiveDocument.SaveAs(saveFile,rawSaveOptions, true,2);

}

static void selectArea( dynamic app,double Left,double Top,double Right,double Bottom )

{

dynamic ad = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

dynamic ar = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

dynamic ad2 = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionDescriptor"));

ar.PutProperty( app.CharIDToTypeID( "Chnl" ), app.CharIDToTypeID( "fsel" ));

ad.PutReference( app.CharIDToTypeID( "null" ), ar );

ad2.PutUnitDouble( app.CharIDToTypeID( "Left" ), app.CharIDToTypeID( "#Pxl" ), Left );

ad2.PutUnitDouble( app.CharIDToTypeID( "Top " ), app.CharIDToTypeID( "#Pxl" ), Top );

ad2.PutUnitDouble( app.CharIDToTypeID( "Rght" ), app.CharIDToTypeID( "#Pxl" ), Right);

ad2.PutUnitDouble( app.CharIDToTypeID( "Btom" ), app.CharIDToTypeID( "#Pxl" ), Bottom );

ad.PutObject( app.CharIDToTypeID( "T   " ), app.CharIDToTypeID( "Rctn" ), ad2 );

app.ExecuteAction( app.CharIDToTypeID( "setd" ), ad, 3 );

}

        private static void SaveForWeb(dynamic app, string saveFile, int percentage)

        {

            // Begin with deleting the destination image if it already existed on disk.

            if (System.IO.File.Exists(saveFile))

            {

                System.IO.File.Delete(saveFile);

            }

            //var options = new ExportOptionsSaveForWeb;

            dynamic options = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ExportOptionsSaveForWeb"));

            options.quality = percentage;

            options.format = 6; // JPEG = 6 (according to Object Model Viewer in Extenscript Toolkit)  .Type.GetTypeFromProgID("SaveDocumentType.JPEG");   // Save Format for the file

            var mockupValidFilePath = System.IO.Directory.GetParent(saveFile).FullName + "\\tempfile.jpg";

            // dynamic exportType = Type.GetTypeFromProgID("ExportType.SAVEFORWEB");

            // ExportType.SAVEFORWEB = 2 (according to Object Model Viewe in Extenscript Toolkit)

            app.ActiveDocument.Export(mockupValidFilePath, 2, options);

            // Since "Save for web and devices" (export document) renders unpredictable results,

            // neglecting the output settings, we rename the file after it has been exported.

            System.IO.File.Move(mockupValidFilePath, saveFile);

        }