Photoshop插件-HDR(四)-脚本开发-PS插件

  PS是一款栅格图像编辑软件,具有许多强大的功能,本文演示如何通过脚本实现HDR风格四相关功能,展示从互联网收集而来的一个小插件,供大家学习交流,请勿用于商业用途。

1.插件界面

  本文界面是一系列功能的一部分,将逐步展示,但是功能界面是共同的,如下图所示:


fa554861ea0947a1af4f546b0b1788c8.png

2.关键代码--HDR风格四

  大家可通过源代码阅读,来掌握相关技巧,源代码如下:

historyState = "U 2.0";
if (app.documents) {
    ErrStrs = {};
    ErrStrs.USER_CANCELED = localize("$$$/ScriptingSupport/Errors/UserCancelled");
    var historyStateNow = -1;
    do {
        historyStateNow++
    } while (app.activeDocument.activeHistoryState != app.activeDocument.historyStates[historyStateNow])
    try {
        app.activeDocument.suspendHistory(historyState, "Name()");
    } catch (e) {
        if (e.number != 8007) {
            alert(e + " : " + e.line);
        } else {
            app.activeDocument.activeHistoryState = app.activeDocument.historyStates[historyStateNow];
            app.activeDocument.suspendHistory(historyState + " [cancelled]", "");
            app.activeDocument.activeHistoryState = app.activeDocument.historyStates[historyStateNow];
        }
    }
}

function Name() {
    if (typeof jamEngine !== "object") {
        var jamEngine = {};

        function() {
            function putInReference(ref, containers) {
                if (containers.constructor === Array) {
                    var count = containers.length;
                    for (var i = 0; i < count; i += 1) {
                        var container = that.parseCompact(containers[i]);
                        var desiredClassId = that.uniIdStrToId(container[0]);
                        var typedValue = that.parseCompact(container[1]);
                        var form = typedValue[0];
                        var value = typedValue[1];
                        switch (form) {
                            case "<class>":
                                ref.putClass(desiredClassId);
                                break;
                            case "<enumerated>":
                                var enumerated = that.parseCompact(value);
                                ref.putEnumerated(desiredClassId, that.uniIdStrToId(enumerated[0]), that.uniIdStrToId(enumerated[1]));
                                break;
                            case "<identifier>":
                                ref.putIdentifier(desiredClassId, value);
                                break;
                            case "<index>":
                                ref.putIndex(desiredClassId, value);
                                break;
                            case "<name>":
                                ref.putName(desiredClassId, value);
                                break;
                            case "<offset>":
                                ref.putOffset(desiredClassId, value);
                                break;
                            case "<property>":
                                ref.putProperty(desiredClassId, that.uniIdStrToId(value));
                                break;
                            default:
                                throw new Error("[jamEngine putInReference] Unknown reference form: " + form)
                                break;
                        }
                    }
                } else {
                    throw new Error("[jamEngine putInReference] JavaScript array expected")
                }
            }

            function putInList(list, items) {
                if (items.constructor === Array) {
                    var count = items.length;
                    for (var i = 0; i < count; i += 1) {
                        var item = that.parseCompact(items[i]);
                        var type = item[0];
                        var value = item[1];
                        switch (type) {
                            case "<boolean>":
                                list.putBoolean(value);
                                break;
                            case "<class>":
                                list.putClass(that.uniIdStrToId(value));
                                break;
                            case "<data>":
                                list.putData(value);
                                break;
                            case "<double>":
                                list.putDouble(value);
                                break;
                            case "<enumerated>":
                                var enumerated = that.parseCompact(value);
                                list.putEnumerated(that.uniIdStrToId(enumerated[0]), that.uniIdStrToId(enumerated[1]));
                                break;
                            case "<integer>":
                                list.putInteger(value);
                                break;
                            case "<largeInteger>":
                                list.putLargeInteger(value);
                                break;
                            case "<list>":
                                var actionList = new ActionList();
                                putInList(actionList, value);
                                list.putList(actionList);
                                break;
                            case "<object>":
                                var object = that.parseCompact(value);
                                if (object[1]) {
                                    var actionDescriptor = new ActionDescriptor();
                                    putInDescriptor(actionDescriptor, object[1]);
                                    list.putObject(that.uniIdStrToId(object[0]), actionDescriptor);
                                } else {
                                    list.putClass(that.uniIdStrToId(object[0]));
                                }
                                break;
                            case "<path>":
                                var fileRef = new File(value);
                                list.putPath(fileRef);
                                break;
                            case "<reference>":
                                var actionReference = new ActionReference();
                                putInReference(actionReference, value);
                                list.putReference(actionReference);
                                break;
                            case "<string>":
                                list.putString(value);
                                break;
                            case "<unitDouble>":
                                var unitDouble = that.parseCompact(value);
                                list.putUnitDouble(that.uniIdStrToId(unitDouble[0]), unitDouble[1]);
                                break;
                            default:
                                throw new Error("[jamEngine putInList] Unknown list type: " + type)
                                break;
                        }
                    }
                } else {
                    throw new Error("[jamEngine putInList] JavaScript array expected")
                }
            }

            function putInDescriptor(desc, members) {
                if (members.constructor === Object) {
                    for (var key in members) {
                        if (members.hasOwnProperty(key)) {
                            var keyID = that.uniIdStrToId(key);
                            var member = that.parseCompact(members[key]);
                            var type = member[0];
                            var value = member[1];
                            switch (type) {
                                case "<boolean>":
                                    desc.putBoolean(keyID, value);
                                    break;
                                case "<class>":
                                    desc.putClass(keyID, that.uniIdStrToId(value));
                                    break;
                                case "<data>":
                                    desc.putData(keyID, value);
                                    break;
                                case "<double>":
                                    desc.putDouble(keyID, value);
                                    break;
                                case "<enumerated>":
                                    var enumerated = that.parseCompact(value);
                                    desc.putEnumerated(keyID, that.uniIdStrToId(enumerated[0]), that.uniIdStrToId(enumerated[1]));
                                    break;
                                case "<integer>":
                                    desc.putInteger(keyID, value);
                                    break;
                                case "<largeInteger>":
                                    desc.putLargeInteger(keyID, value);
                                    break;
                                case "<list>":
                                    var actionList = new ActionList();
                                    putInList(actionList, value);
                                    desc.putList(keyID, actionList);
                                    break;
                                case "<object>":
                                    var object = that.parseCompact(value);
                                    if (object[1]) {
                                        var actionDescriptor = new ActionDescriptor();
                                        putInDescriptor(actionDescriptor, object[1]);
                                        desc.putObject(keyID, that.uniIdStrToId(object[0]), actionDescriptor);
                                    } else {
                                        desc.putClass(keyID, that.uniIdStrToId(object[0]));
                                    }
                                    break;
                                case "<path>":
                                    var fileRef = new File(value);
                                    desc.putPath(keyID, fileRef);
                                    break;
                                case "<reference>":
                                    var actionReference = new ActionReference();
                                    putInReference(actionReference, value);
                                    desc.putReference(keyID, actionReference);
                                    break;
                                case "<string>":
                                    desc.putString(keyID, value);
                                    break;
                                case "<unitDouble>":
                                    var unitDouble = that.parseCompact(value);
                                    desc.putUnitDouble(keyID, that.uniIdStrToId(unitDouble[0]), unitDouble[1]);
                                    break;
                                default:
                                    throw new Error("[jamEngine putInDescriptor] Unknown descriptor type: " + type)
                                    break;
                            }
                        }
                    }
                } else {
                    throw new Error("[jamEngine putInDescriptor] JavaScript object expected")
                }
            }

            function getFromId(context, parentContext) {
                var kind = context[0];
                var id = context[1];
                if (id < smallestHashValue) {
                    uniIdStr = app.typeIDToStringID(id);
                } else {
                    uniIdStr = "'" + app.typeIDToCharID(id) + "'";
                    if (that.meaningfulIds) {
                        if (uniIdStr in contextRules) {
                            function resolveIdStr(candidates) {
                                var idStr = "";
                                for (var parentString in candidates) {
                                    if (candidates.hasOwnProperty(parentString)) {
                                        if (parentContext[1] === that.uniIdStrToId(parentString)) {
                                            idStr = candidates[parentString];
                                            break;
                                        }
                                    }
                                }
                                return idStr;
                            }
                            var resolvedIdStr = "";
                            var rule = contextRules[uniIdStr];
                            if (parentContext) {
                                switch (kind) {
                                    case "<key>":
                                        if (parentContext[0] === "<class>" && "<classKey>" in rule) {
                                            resolvedIdStr = resolveIdStr(rule["<classKey>"]);
                                        } else {
                                            if (parentContext[0] === "<event>" && "<eventKey>" in rule) {
                                                resolvedIdStr = resolveIdStr(rule["<eventKey>"]);
                                            }
                                        }
                                        break;
                                    case "<enumValue>":
                                        if (parentContext[0] === "<enumType>" && "<typeValue>" in rule) {
                                            resolvedIdStr = resolveIdStr(rule["<typeValue>"]);
                                        }
                                        break;
                                }
                            }
                            if (resolvedIdStr !== "") {
                                uniIdStr = resolvedIdStr;
                            } else {
                                if (kind in rule) {
                                    uniIdStr = rule[kind];
                                }
                            }
                        } else {
                            var stringIDStr = app.typeIDToStringID(id);
                            if (stringIDStr !== "") {
                                uniIdStr = stringIDStr;
                            }
                        }
                    }
                }
                return uniIdStr;
            }

            function getFromReference(ref) {
                var propertyId = 0;
                var arr = [];
                do {
                    try {
                        var desiredClassId = ref.getDesiredClass();
                    } catch (e) {
                        break;
                    }
                    if (propertyId !== 0) {
                        var propertyCompact = that.buildCompact("<property>", getFromId(["<key>", propertyId], ["<class>", desiredClassId]));
                        arr.push(that.buildCompact(getFromId(["<class>", propertyClassId]), propertyCompact));
                        propertyId = 0;
                    }
                    var aFormID = ref.getForm();
                    switch (aFormID) {
                        case ReferenceFormType.CLASSTYPE:
                            desiredCompact = that.buildCompact("<class>", null);
                            break;
                        case ReferenceFormType.ENUMERATED:
                            var enumTypeContext = ["<enumType>", ref.getEnumeratedType()];
                            var enumValueContext = ["<enumValue>", ref.getEnumeratedValue()];
                            desiredCompact = that.buildCompact("<enumerated>", that.buildCompact(getFromId(enumTypeContext), getFromId(enumValueContext, enumTypeContext)));
                            break;
                        case ReferenceFormType.IDENTIFIER:
                            desiredCompact = that.buildCompact("<identifier>", ref.getIdentifier());
                            break;
                        case ReferenceFormType.INDEX:
                            desiredCompact = that.buildCompact("<index>", ref.getIndex());
                            break;
                        case ReferenceFormType.NAME:
                            desiredCompact = that.buildCompact("<name>", ref.getName());
                            break;
                        case ReferenceFormType.OFFSET:
                            desiredCompact = that.buildCompact("<offset>", ref.getOffset());
                            break;
                        case ReferenceFormType.PROPERTY:
                            if (desiredClassId === propertyClassId) {
                                propertyId = ref.getProperty();
                            } else {
                                desiredCompact = that.buildCompact("<property>", getFromId(["<key>", ref.getProperty()], ["<class>", desiredClassId]));
                            }
                            break;
                        default:
                            throw new Error("[jamEngine getFromReference] Unknown reference form type: " + aFormID)
                            break;
                    }
                    if (desiredClassId !== propertyClassId) {
                        arr.push(that.buildCompact(getFromId(["<class>", desiredClassId]), desiredCompact));
                    }
                    ref = ref.getContainer();
                } while (ref)
                return arr;
            }

            function getFromList(list) {
                var arr = [];
                var itemCount = list.count;
                for (var itemIndex = 0; itemIndex < itemCount; itemIndex += 1) {
                    try {
                        typeID = list.getType(itemIndex);
                    } catch (e) {
                        continue;
                    }
                    switch (typeID) {
                        case DescValueType.BOOLEANTYPE:
                            itemCompact = that.buildCompact("<boolean>", list.getBoolean(itemIndex));
                            break;
                        case DescValueType.CLASSTYPE:
                            itemCompact = that.buildCompact("<class>", getFromId(["<class>", list.getClass(itemIndex)]));
                            break;
                        case DescValueType.DOUBLETYPE:
                            itemCompact = that.buildCompact("<double>", list.getDouble(itemIndex));
                            break;
                        case DescValueType.ENUMERATEDTYPE:
                            var enumTypeContext = ["<enumType>", list.getEnumerationType(itemIndex)];
                            var enumValueContext = ["<enumValue>", list.getEnumerationValue(itemIndex)];
                            itemCompact = that.buildCompact("<enumerated>", that.buildCompact(getFromId(enumTypeContext), getFromId(enumValueContext, enumTypeContext)));
                            break;
                        case DescValueType.INTEGERTYPE:
                            itemCompact = that.buildCompact("<integer>", list.getInteger(itemIndex));
                            break;
                        case DescValueType.LISTTYPE:
                            itemCompact = that.buildCompact("<list>", getFromList(list.getList(itemIndex)));
                            break;
                        case DescValueType.OBJECTTYPE:
                            var objectTypeContext = ["<class>", list.getObjectType(itemIndex)];
                            var objectValue = list.getObjectValue(itemIndex);
                            itemCompact = that.buildCompact("<object>", that.buildCompact(getFromId(objectTypeContext), getFromDescriptor(objectValue, objectTypeContext)));
                            break;
                        case DescValueType.ALIASTYPE:
                            try {
                                var fileRef = list.getPath(itemIndex);
                                itemCompact = that.buildCompact("<path>", fileRef.fsName);
                            } catch (e) {
                                itemCompact = that.buildCompact("<path>", incompatiblePlatformPath);
                            }
                            break;
                        case DescValueType.REFERENCETYPE:
                            itemCompact = that.buildCompact("<reference>", getFromReference(list.getReference(itemIndex)));
                            break;
                        case DescValueType.STRINGTYPE:
                            itemCompact = that.buildCompact("<string>", list.getString(itemIndex));
                            break;
                        case DescValueType.UNITDOUBLE:
                            var unitTypeContext = ["<unit>", list.getUnitDoubleType(itemIndex)];
                            var doubleValue = list.getUnitDoubleValue(itemIndex);
                            itemCompact = that.buildCompact("<unitDouble>", that.buildCompact(getFromId(unitTypeContext), doubleValue));
                            break;
                        default:
                            try {
                                isRawType = typeID === DescValueType.RAWTYPE;
                            } catch (e) {

                            }
                            try {
                                isLargeIntegerType = typeID === DescValueType.LARGEINTEGERTYPE;
                            } catch (e) {

                            }
                            if (isRawType) {
                                itemCompact = that.buildCompact("<data>", list.getData(itemIndex));
                            } else if (isLargeIntegerType) {
                                itemCompact = that.buildCompact("<largeInteger>", list.getLargeInteger(itemIndex));
                            } else {
                                throw new Error("[jamEngine getFromList] Unknown descriptor value type: " + typeID)
                            }
                            break;
                    }
                    arr[itemIndex] = itemCompact;
                }
                return arr;
            }

            function getFromDescriptor(desc, parentContext) {
                if (desc) {
                    var obj = {};
                    try {
                        keyCount = desc.count;
                    } catch (e) {
                        return null;
                    }
                    for (var keyIndex = 0; keyIndex < keyCount; keyIndex += 1) {
                        var keyID = desc.getKey(keyIndex);
                        var keyString = getFromId(["<key>", keyID], parentContext);
                        try {
                            typeID = desc.getType(keyID);
                        } catch (e) {
                            continue;
                        }
                        switch (typeID) {
                            case DescValueType.BOOLEANTYPE:
                                keyCompact = that.buildCompact("<boolean>", desc.getBoolean(keyID));
                                break;
                            case DescValueType.CLASSTYPE:
                                keyCompact = that.buildCompact("<class>", getFromId(["<class>", desc.getClass(keyID)]));
                                break;
                            case DescValueType.DOUBLETYPE:
                                keyCompact = that.buildCompact("<double>", desc.getDouble(keyID));
                                break;
                            case DescValueType.ENUMERATEDTYPE:
                                var enumTypeContext = ["<enumType>", desc.getEnumerationType(keyID)];
                                var enumValueContext = ["<enumValue>", desc.getEnumerationValue(keyID)];
                                keyCompact = that.buildCompact("<enumerated>", that.buildCompact(getFromId(enumTypeContext), getFromId(enumValueContext, enumTypeContext)));
                                break;
                            case DescValueType.INTEGERTYPE:
                                keyCompact = that.buildCompact("<integer>", desc.getInteger(keyID));
                                break;
                            case DescValueType.LISTTYPE:
                                keyCompact = that.buildCompact("<list>", getFromList(desc.getList(keyID)));
                                break;
                            case DescValueType.OBJECTTYPE:
                                var objectTypeContext = ["<class>", desc.getObjectType(keyID)];
                                var objectValue = desc.getObjectValue(keyID);
                                keyCompact = that.buildCompact("<object>", that.buildCompact(getFromId(objectTypeContext), getFromDescriptor(objectValue, objectTypeContext)));
                                break;
                            case DescValueType.ALIASTYPE:
                                try {
                                    var fileRef = desc.getPath(keyID);
                                    keyCompact = that.buildCompact("<path>", fileRef.fsName);
                                } catch (e) {
                                    keyCompact = that.buildCompact("<path>", incompatiblePlatformPath);
                                }
                                break;
                            case DescValueType.REFERENCETYPE:
                                keyCompact = that.buildCompact("<reference>", getFromReference(desc.getReference(keyID)));
                                break;
                            case DescValueType.STRINGTYPE:
                                keyCompact = that.buildCompact("<string>", desc.getString(keyID));
                                break;
                            case DescValueType.UNITDOUBLE:
                                var unitTypeContext = ["<unit>", desc.getUnitDoubleType(keyID)];
                                var doubleValue = desc.getUnitDoubleValue(keyID);
                                keyCompact = that.buildCompact("<unitDouble>", that.buildCompact(getFromId(unitTypeContext), doubleValue));
                                break;
                            default:
                                try {
                                    isRawType = typeID === DescValueType.RAWTYPE;
                                } catch (e) {

                                }
                                try {
                                    isLargeIntegerType = typeID === DescValueType.LARGEINTEGERTYPE;
                                } catch (e) {

                                }
                                if (isRawType) {
                                    keyCompact = that.buildCompact("<data>", desc.getData(keyID));
                                } else if (isLargeIntegerType) {
                                    keyCompact = that.buildCompact("<largeInteger>", desc.getLargeInteger(keyID));
                                } else {
                                    throw new Error("[jamEngine getFromDescriptor] Unknown descriptor value type: " + typeID)
                                }
                                break;
                        }
                        obj[keyString] = keyCompact;
                    }
                    return obj;
                } else {
                    return null;
                }
            }

            function getReferenceClassId(ref) {
                classId = 0;
                do {
                    try {
                        var desiredClassId = ref.getDesiredClass();
                    } catch (e) {
                        break;
                    }
                    if (desiredClassId !== propertyClassId) {
                        classId = desiredClassId;
                        break;
                    }
                    ref = ref.getContainer();
                } while (ref)
                return classId;
            }

            function simplifyRef(ref) {
                var simplifiedRef = [];
                for (var i = 0; i < ref.length; i += 1) {
                    var element = ref[i];
                    var simplifiedElement = {};
                    var desiredClass = element[0];
                    var form = element[1][0];
                    var value = element[1][1];
                    switch (form) {
                        case "<class>":
                        case "<identifier>":
                        case "<index>":
                        case "<name>":
                        case "<offset>":
                        case "<property":
                            simplifiedElement[desiredClass] = value;
                            break;
                        case "<enumerated>":
                            simplifiedElement[desiredClass] = value[1];
                            break;
                        default:
                            throw new Error("[jamEngine simplifyRef] Unexpected element form: " + form)
                            break;
                    }
                    simplifiedRef.push(simplifiedElement);
                }
                return simplifiedRef;
            }

            function simplifyItem(item, hook) {
                var type = item[0];
                var value = item[1];
                switch (type) {
                    case "<boolean>":
                    case "<class>":
                    case "<data>":
                    case "<double>":
                    case "<integer>":
                    case "<largeInteger>":
                    case "<path>":
                    case "<string>":
                        simplifiedItem = value;
                        break;
                    case "<list>":
                        simplifiedItem = simplifyList(value, hook);
                        break;
                    case "<enumerated>":
                    case "<unitDouble>":
                        simplifiedItem = value[1];
                        break;
                    case "<object>":
                        simplifiedItem = simplifyDesc(value[1], hook);
                        break;
                    case "<reference>":
                        simplifiedItem = simplifyRef(value);
                        break;
                    default:
                        throw new Error("[jamEngine simplifyItem] Unexpected item type: " + type)
                        break;
                }
                return simplifiedItem;
            }

            function simplifyList(list, hook) {
                var simplifiedList = [];
                for (var i = 0; i < list.length; i += 1) {
                    simplifiedList.push(simplifyItem(list[i], hook));
                }
                return simplifiedList;
            }

            function simplifyDesc(desc, hook) {
                var getDefaultValue = function(desc, key) {
                    return simplifyItem(desc[key], hook);
                };
                var simplifiedDesc = {};
                for (var key in desc) {
                    if (desc.hasOwnProperty(key)) {
                        var value = undefined;
                        if (typeof hook === "function") {
                            value = hook(desc, key, getDefaultValue);
                        }
                        if (typeof value === "undefined") {
                            value = simplifyItem(desc[key], hook);
                        }
                        simplifiedDesc[key] = value;
                    }
                }
                return simplifiedDesc;
            }
            jamEngine.meaningfulIds = false;
            jamEngine.parseFriendly = false;
            jamEngine.displayDialogs = DialogModes.ERROR;
            var conflictingStringIdStrs = {
                "'Algn'": ["align", "alignment"],
                "'AntA'": ["antiAlias", "antiAliasedPICTAcquire"],
                "'BckL'": ["backgroundLayer", "backgroundLevel"],
                "'BlcG'": ["blackGenerationType", "blackGenerationCurve"],
                "'BlcL'": ["blackLevel", "blackLimit"],
                "'Blks'": ["blacks", "blocks"],
                "'BlrM'": ["blurMethod", "blurMore"],
                "'BrgC'": ["brightnessEvent", "brightnessContrast"],
                "'BrsD'": ["brushDetail", "brushesDefine"],
                "'Brsh'": ["brush", "brushes"],
                "'Clcl'": ["calculation", "calculations"],
                "'ClrP'": ["colorPalette", "coloredPencil"],
                "'Cnst'": ["constant", "constrain"],
                "'CntC'": ["centerCropMarks", "conteCrayon"],
                "'Cntr'": ["center", "contrast"],
                "'CrtD'": ["createDroplet", "createDuplicate"],
                "'CstP'": ["customPalette", "customPhosphors"],
                "'Cstm'": ["custom", "customPattern"],
                "'Drkn'": ["darken", "darkness"],
                "'Dstr'": ["distort", "distortion", "distribute", "distribution"],
                "'Dstt'": ["desaturate", "destWhiteMax"],
                "'FlIn'": ["fileInfo", "fillInverse"],
                "'Gd  '": ["good", "guide"],
                "'GnrP'": ["generalPreferences", "generalPrefs", "preferencesClass"],
                "'GrSt'": ["grainStippled", "graySetup"],
                "'Grdn'": ["gradientClassEvent", "gridMinor"],
                "'Grn '": ["grain", "green"],
                "'Grns'": ["graininess", "greens"],
                "'HstP'": ["historyPreferences", "historyPrefs"],
                "'HstS'": ["historyState", "historyStateSourceType"],
                "'ImgP'": ["imageCachePreferences", "imagePoint"],
                "'In  '": ["in", "stampIn"],
                "'IntW'": ["interfaceWhite", "intersectWith"],
                "'Intr'": ["interfaceIconFrameDimmed", "interlace", "interpolation", "intersect"],
                "'JPEG'": ["JPEG", "JPEGFormat"],
                "'LghD'": ["lightDirection", "lightDirectional"],
                "'LghO'": ["lightOmni", "lightenOnly"],
                "'LghS'": ["lightSource", "lightSpot"],
                "'Lns '": ["lens", "lines"],
                "'Mgnt'": ["magenta", "magentas"],
                "'MrgL'": ["mergeLayers", "mergedLayers"],
                "'Mxm '": ["maximum", "maximumQuality"],
                "'NTSC'": ["NTSC", "NTSCColors"],
                "'NmbL'": ["numberOfLayers", "numberOfLevels"],
                "'PlgP'": ["pluginPicker", "pluginPrefs"],
                "'Pncl'": ["pencilEraser", "pencilWidth"],
                "'Pnt '": ["paint", "point"],
                "'Prsp'": ["perspective", "perspectiveIndex"],
                "'PrvM'": ["previewMacThumbnail", "previewMagenta"],
                "'Pstr'": ["posterization", "posterize"],
                "'RGBS'": ["RGBSetup", "RGBSetupSource"],
                "'Rds '": ["radius", "reds"],
                "'ScrD'": ["scratchDisks", "screenDot"],
                "'ShdI'": ["shadingIntensity", "shadowIntensity"],
                "'ShpC'": ["shapeCurveType", "shapingCurve"],
                "'ShrE'": ["sharpenEdges", "shearEd"],
                "'Shrp'": ["sharpen", "sharpness"],
                "'SplC'": ["splitChannels", "supplementalCategories"],
                "'Spot'": ["spot", "spotColor"],
                "'SprS'": ["separationSetup", "sprayedStrokes"],
                "'StrL'": ["strokeLength", "strokeLocation"],
                "'Strt'": ["saturation", "start"],
                "'TEXT'": ["char", "textType"],
                "'TIFF'": ["TIFF", "TIFFFormat"],
                "'TglO'": ["toggleOptionsPalette", "toggleOthers"],
                "'TrnG'": ["transparencyGamutPreferences", "transparencyGrid", "transparencyGridSize"],
                "'TrnS'": ["transferSpec", "transparencyShape", "transparencyStop"],
                "'Trns'": ["transparency", "transparent"],
                "'TxtC'": ["textClickPoint", "textureCoverage"],
                "'TxtF'": ["textureFile", "textureFill"],
                "'UsrM'": ["userMaskEnabled", "userMaskOptions"],
                "'c@#^'": ["inherits", "pInherits"],
                "'comp'": ["comp", "sInt64"],
                "'doub'": ["floatType", "IEEE64BitFloatingPoint", "longFloat"],
                "'long'": ["integer", "longInteger", "sInt32"],
                "'magn'": ["magnitude", "uInt32"],
                "'null'": ["null", "target"],
                "'shor'": ["sInt16", "sMInt", "shortInteger"],
                "'sing'": ["IEEE32BitFloatingPoint", "sMFloat", "shortFloat"]
            };
            jamEngine.getConflictingStringIdStrs = function(charIdStr) {
                return conflictingStringIdStrs[charIdStr] || null;
            };
            jamEngine.uniIdStrToId = function(uniIdStr) {
                var id = 0;
                if (typeof uniIdStr === "string") {
                    if (uniIdStr.length === 6 && uniIdStr.charAt(0) === "'" && uniIdStr.charAt(5) === "'") {
                        id = app.charIDToTypeID(uniIdStr.substring(1, 5));
                    } else {
                        id = app.stringIDToTypeID(uniIdStr);
                    }
                }
                return id;
            };
            var smallestHashValue = app.charIDToTypeID("    ");
            jamEngine.idToUniIdStrs = function(id) {
                var charIdStr = "";
                var stringIdStr = app.typeIDToStringID(id);
                if (id >= smallestHashValue) {
                    charIdStr = "'" + app.typeIDToCharID(id) + "'";
                    if (stringIdStr !== "") {
                        if (charIdStr in conflictingStringIdStrs) {
                            stringIdStr = conflictingStringIdStrs[charIdStr];
                        }
                    }
                }
                return [charIdStr, stringIdStr];
            };
            jamEngine.equivalentUniIdStrs = function(uniIdStr1, uniIdStr2) {
                return this.uniIdStrToId(uniIdStr1) === this.uniIdStrToId(uniIdStr2);
            };
            var contextRules = {
                "'Algn'": {
                    "<classKey>": {
                        bevelEmboss: "align",
                        frameFX: "align",
                        gradientFill: "align",
                        gradientLayer: "align",
                        patternFill: "align",
                        patternLayer: "align"
                    },
                    "<event>": "align",
                    "<key>": "alignment"
                },
                "'AntA'": {
                    "<class>": "antiAliasedPICTAcquire",
                    "<key>": "antiAlias"
                },
                "'BckL'": {
                    "<class>": "backgroundLayer",
                    "<key>": "backgroundLevel"
                },
                "'BlcG'": {
                    "<enumType>": "blackGenerationType",
                    "<key>": "blackGenerationCurve"
                },
                "'BlcL'": {
                    "<classKey>": {
                        "'GEfc'": "blackLevel",
                        CMYKSetup: "blackLimit"
                    },
                    "<eventKey>": {
                        reticulation: "blackLevel"
                    }
                },
                "'Blks'": {
                    "<typeValue>": {
                        colors: "blacks",
                        extrudeType: "blocks"
                    }
                },
                "'BlrM'": {
                    "<enumType>": "blurMethod",
                    "<event>": "blurMore",
                    "<key>": "blurMethod"
                },
                "'BrgC'": {
                    "<class>": "brightnessContrast",
                    "<event>": "brightnessContrast"
                },
                "'BrsD'": {
                    "<enumValue>": "brushesDefine",
                    "<key>": "brushDetail"
                },
                "'Brsh'": {
                    "<class>": "brush",
                    "<key>": "brushes"
                },
                "'Clcl'": {
                    "<class>": "calculation",
                    "<enumValue>": "calculations",
                    "<key>": "calculation"
                },
                "'ClrP'": {
                    "<typeValue>": {
                        "'GEft'": "coloredPencil"
                    },
                    "<enumType>": "colorPalette",
                    "<event>": "coloredPencil"
                },
                "'Cnst'": {
                    "<classKey>": {
                        channelMatrix: "constant"
                    },
                    "<unknown>": "constrain"
                },
                "'CntC'": {
                    "<typeValue>": {
                        "'GEft'": "conteCrayon"
                    },
                    "<event>": "conteCrayon",
                    "<key>": "centerCropMarks"
                },
                "'Cntr'": {
                    "<classKey>": {
                        "'GEfc'": "contrast",
                        brightnessContrast: "contrast",
                        document: "center",
                        polygon: "center",
                        quadrilateral: "center"
                    },
                    "<eventKey>": {
                        adaptCorrect: "contrast",
                        brightnessEvent: "contrast",
                        grain: "contrast",
                        halftoneScreen: "contrast",
                        sumie: "contrast",
                        tornEdges: "contrast",
                        waterPaper: "contrast"
                    },
                    "<enumValue>": "center"
                },
                "'CrtD'": {
                    "<enumValue>": "createDuplicate",
                    "<event>": "createDroplet"
                },
                "'CstP'": {
                    "<class>": "customPhosphors",
                    "<key>": "customPalette"
                },
                "'Cstm'": {
                    "<enumValue>": "customPattern",
                    "<event>": "custom",
                    "<key>": "custom"
                },
                "'Drkn'": {
                    "<enumValue>": "darken",
                    "<key>": "darkness"
                },
                "'Dstr'": {
                    "<classKey>": {
                        "'GEfc'": "distortion"
                    },
                    "<eventKey>": {
                        glass: "distortion",
                        addNoise: "distribution"
                    },
                    "<enumType>": "distribution",
                    "<enumValue>": "distort",
                    "<event>": "distribute"
                },
                "'Dstt'": {
                    "<enumValue>": "desaturate",
                    "<event>": "desaturate",
                    "<key>": "destWhiteMax"
                },
                "'FlIn'": {
                    "<typeValue>": {
                        fillColor: "fillInverse",
                        menuItemType: "fileInfo"
                    },
                    "<class>": "fileInfo",
                    "<key>": "fileInfo"
                },
                "'Gd  '": {
                    "<class>": "guide",
                    "<enumValue>": "good"
                },
                "'GnrP'": {
                    "<class>": "preferencesClass",
                    "<enumValue>": "generalPreferences",
                    "<key>": "generalPrefs"
                },
                "'GrSt'": {
                    "<class>": "graySetup",
                    "<enumValue>": "grainStippled",
                    "<key>": "graySetup"
                },
                "'Grdn'": {
                    "<class>": "gradientClassEvent",
                    "<event>": "gradientClassEvent",
                    "<key>": "gridMinor"
                },
                "'Grn '": {
                    "<typeValue>": {
                        "'GEft'": "grain"
                    },
                    "<classKey>": {
                        "'GEfc'": "grain",
                        RGBColor: "green",
                        blackAndWhite: "green",
                        channelMatrix: "green",
                        channelMixer: "green"
                    },
                    "<eventKey>": {
                        blackAndWhite: "green",
                        channelMixer: "green",
                        filmGrain: "grain"
                    },
                    "<enumValue>": "green",
                    "<event>": "grain"
                },
                "'Grns'": {
                    "<enumValue>": "greens",
                    "<key>": "graininess"
                },
                "'HstP'": {
                    "<enumValue>": "historyPreferences",
                    "<key>": "historyPrefs"
                },
                "'HstS'": {
                    "<class>": "historyState",
                    "<enumType>": "historyStateSourceType"
                },
                "'ImgP'": {
                    "<class>": "imagePoint",
                    "<enumValue>": "imageCachePreferences"
                },
                "'In  '": {
                    "<enumValue>": "stampIn",
                    "<key>": "in"
                },
                "'IntW'": {
                    "<event>": "intersectWith",
                    "<key>": "interfaceWhite"
                },
                "'Intr'": {
                    "<typeValue>": {
                        shapeOperation: "intersect"
                    },
                    "<classKey>": {
                        GIFFormat: "interlace",
                        SaveForWeb: "interlace",
                        application: "interfaceIconFrameDimmed",
                        computedBrush: "interpolation",
                        dBrush: "interpolation",
                        gradientClassEvent: "interpolation",
                        photoshopEPSFormat: "interpolation",
                        sampledBrush: "interpolation"
                    },
                    "<eventKey>": {
                        convertMode: "interpolation",
                        imageSize: "interpolation",
                        transform: "interpolation"
                    },
                    "<event>": "intersect"
                },
                "'JPEG'": {
                    "<class>": "JPEGFormat",
                    "<enumValue>": "JPEG"
                },
                "'LghD'": {
                    "<enumType>": "lightDirection",
                    "<enumValue>": "lightDirectional",
                    "<key>": "lightDirection"
                },
                "'LghO'": {
                    "<typeValue>": {
                        diffuseMode: "lightenOnly",
                        lightType: "lightOmni"
                    }
                },
                "'LghS'": {
                    "<class>": "lightSource",
                    "<enumValue>": "lightSpot",
                    "<key>": "lightSource"
                },
                "'Lns '": {
                    "<enumType>": "lens",
                    "<enumValue>": "lines",
                    "<key>": "lens"
                },
                "'Mgnt'": {
                    "<typeValue>": {
                        channel: "magenta",
                        colors: "magentas",
                        guideGridColor: "magenta"
                    },
                    "<key>": "magenta"
                },
                "'MrgL'": {
                    "<enumValue>": "mergedLayers",
                    "<event>": "mergeLayers"
                },
                "'Mxm '": {
                    "<enumValue>": "maximumQuality",
                    "<event>": "maximum",
                    "<key>": "maximum"
                },
                "'NTSC'": {
                    "<enumValue>": "NTSC",
                    "<event>": "NTSCColors"
                },
                "'NmbL'": {
                    "<classKey>": {
                        "'GEfc'": "numberOfLevels",
                        document: "numberOfLayers"
                    },
                    "<eventKey>": {
                        cutout: "numberOfLevels"
                    }
                },
                "'PlgP'": {
                    "<class>": "pluginPrefs",
                    "<enumValue>": "pluginPicker",
                    "<key>": "pluginPrefs"
                },
                "'Pncl'": {
                    "<enumValue>": "pencilEraser",
                    "<key>": "pencilWidth"
                },
                "'Pnt '": {
                    "<typeValue>": {
                        textType: "point"
                    },
                    "<class>": "point",
                    "<event>": "paint"
                },
                "'Prsp'": {
                    "<enumValue>": "perspective",
                    "<key>": "perspectiveIndex"
                },
                "'PrvM'": {
                    "<enumValue>": "previewMagenta",
                    "<key>": "previewMacThumbnail"
                },
                "'Pstr'": {
                    "<class>": "posterize",
                    "<event>": "posterize",
                    "<key>": "posterization"
                },
                "'RGBS'": {
                    "<enumType>": "RGBSetupSource",
                    "<key>": "RGBSetup"
                },
                "'Rds '": {
                    "<enumValue>": "reds",
                    "<key>": "radius"
                },
                "'ScrD'": {
                    "<enumValue>": "screenDot",
                    "<key>": "scratchDisks"
                },
                "'ShdI'": {
                    "<classKey>": {
                        "'GEfc'": "shadowIntensity"
                    },
                    "<eventKey>": {
                        watercolor: "shadowIntensity"
                    },
                    "<unknown>": "shadingIntensity"
                },
                "'ShpC'": {
                    "<classKey>": {
                        application: "shapingCurve"
                    },
                    "<class>": "shapingCurve",
                    "<key>": "shapeCurveType"
                },
                "'ShrE'": {
                    "<event>": "sharpenEdges",
                    "<key>": "shearEd"
                },
                "'Shrp'": {
                    "<event>": "sharpen",
                    "<key>": "sharpness"
                },
                "'SplC'": {
                    "<event>": "splitChannels",
                    "<key>": "supplementalCategories"
                },
                "'Spot'": {
                    "<enumValue>": "spotColor",
                    "<key>": "spot"
                },
                "'SprS'": {
                    "<typeValue>": {
                        "'GEft'": "sprayedStrokes"
                    },
                    "<enumValue>": "separationSetup",
                    "<event>": "sprayedStrokes"
                },
                "'StrL'": {
                    "<enumType>": "strokeLocation",
                    "<key>": "strokeLength"
                },
                "'Strt'": {
                    "<classKey>": {
                        currentToolOptions: "saturation",
                        fileNamingRules: "start",
                        HSBColorClass: "saturation",
                        hueSatAdjustment: "saturation",
                        hueSatAdjustmentV2: "saturation",
                        lineClass: "start",
                        range: "start",
                        vibrance: "saturation"
                    },
                    "<eventKey>": {
                        replaceColor: "saturation",
                        variations: "saturation",
                        vibrance: "saturation"
                    },
                    "<enumValue>": "saturation"
                },
                "'TEXT'": {
                    "<enumType>": "textType",
                    "<key>": "textType"
                },
                "'TIFF'": {
                    "<class>": "TIFFFormat",
                    "<enumValue>": "TIFF"
                },
                "'TglO'": {
                    "<enumValue>": "toggleOptionsPalette",
                    "<key>": "toggleOthers"
                },
                "'TrnG'": {
                    "<classKey>": {
                        application: "transparencyGrid",
                        transparencyPrefs: "transparencyGridSize"
                    },
                    "<enumType>": "transparencyGridSize",
                    "<enumValue>": "transparencyGamutPreferences"
                },
                "'TrnS'": {
                    "<classKey>": {
                        bevelEmboss: "transparencyShape",
                        dropShadow: "transparencyShape",
                        innerGlow: "transparencyShape",
                        innerShadow: "transparencyShape",
                        outerGlow: "transparencyShape"
                    },
                    "<class>": "transparencyStop",
                    "<unknown>": "transferSpec"
                },
                "'Trns'": {
                    "<enumValue>": "transparent",
                    "<key>": "transparency"
                },
                "'TxtC'": {
                    "<classKey>": {
                        "'GEfc'": "textureCoverage",
                        textLayer: "textClickPoint"
                    },
                    "<eventKey>": {
                        underpainting: "textureCoverage"
                    }
                },
                "'TxtF'": {
                    "<event>": "textureFill",
                    "<key>": "textureFile"
                },
                "'UsrM'": {
                    "<enumType>": "userMaskOptions",
                    "<key>": "userMaskEnabled"
                },
                "'null'": {
                    "<class>": "null",
                    "<enumValue>": "null",
                    "<event>": "null",
                    "<key>": "target"
                }
            };
            var incompatiblePlatformPath = "";
            var getEventId = app.stringIDToTypeID("get");
            var targetKeyId = app.stringIDToTypeID("target");
            var propertyClassId = app.stringIDToTypeID("property");
            jamEngine.jsonToActionDescriptor = function(descriptorObj) {
                that = this;
                if (descriptorObj) {
                    actionDescriptor = new ActionDescriptor();
                    putInDescriptor(actionDescriptor, descriptorObj);
                }
                return actionDescriptor;
            };
//代码过长,部分代码省略,如需请私信博主获取

3.代码转执行

  使用记事本或者notepad++等文本编辑器,将代码拷贝至文本文件,然后修改后缀名为js或者jsx,最后再PS软件菜单文件》脚本》浏览,点执行即可,也可以将脚本放在预设文件夹内,会显示再脚本下的二级子菜单。如下图所示:


PS脚本执行.png

4.作者答疑


文章引用至 作者知了-联系方式1

文章引用至 作者知了-联系方式2

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容