3

ExtendScriptを使用してAdobePhotoshopCS5でテキスト(またはその他の)レイヤーシャドウパラメータを取得し、テキスト文字列のようなCSS3にさらに変換する方法はありますか?

ありがとう!

4

4 に答える 4

2

やり方がある。

ActionManagerを使用する必要があります。

var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") ); 
var desc = executeActionGet(ref).getObjectValue(stringIDToTypeID('layerEffects')).getObjectValue(stringIDToTypeID('dropShadow'));
desc.getUnitDoubleValue(stringIDToTypeID('distance'))

ここで、「dropShadow」は読み取りたいlayereffectであり、たとえば「distance」は返されるパラメーターです。その他のレイヤーエフェクトとパラメーターは、eventidとしてのみ知られています。他のeventidが必要な場合は、ドキュメント(悪いドキュメント)を調べてください。

次のAMコードは、レイヤースタイルのシャドウがあるかどうかをチェックします。

var res = false;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") ); 
var hasFX =  executeActionGet(ref).hasKey(stringIDToTypeID('layerEffects'));
if ( hasFX ){
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") ); 
res = executeActionGet(ref).getObjectValue(stringIDToTypeID('layerEffects')).hasKey(stringIDToTypeID('dropShadow'));
    }
return res;

これにより、http://forums.adobe.com/thread/714406の詳細が説明されます。

他のパラメータを設定せずにシャドウを設定する方法を見つけたら、私に知らせてください...

于 2013-03-04T17:02:33.723 に答える
1

おそらくあなたが探している答えではありませんが、extendscriptからレイヤースタイルの個々のプロパティにアクセスする方法は実際にはありません。レイヤースタイルを参照するAPIの唯一のメソッド(CS6以降)はですArtLayer.applyStyle(name)。これを使用するには、実際にPhotoshopでスタイルを作成し、名前でパレットに保存する必要があります。

私が考えることができる唯一のことは、C /C++を使用して.asl見つかったファイルを実際に解析することです。adobe/Adobe Photoshop/presets/styles/これらのファイルには、独自の形式で保存されたいくつかのレイヤースタイルが含まれています。これらのファイルを解析するライブラリは見つかりませんでしたが、存在する可能性があります。

于 2012-12-05T17:08:40.510 に答える
1

Photoshop CS6.1(またはそれ以降)を使用している場合は、「CSSをクリップボードにコピー」機能の実装をチェックして、ドロップシャドウパラメーターにアクセスする方法を確認できます。

Windowsでは、このためのソースコードは

Adobe Photoshop CS6\Required\CopyCSSToClipboard.jsx

Macの場合、ソースコードは次のとおりです。

Adobe Photoshop CS6/Adobe Photoshop CS6.app/Contents/Required/CopyCSSToClipboard.jsx

(MacのFinderを表示している場合は、PhotoshopアプリのアイコンをControlキーを押しながらクリックし、[パッケージの内容を表示]を選択してContents / Requiredフォルダーに移動する必要があります)。

cssToClip.addDropShadow情報を抽出する方法の例については、ルーチンを探してください。CopyCSSToClipboard.jsxのルーチンを独自のコードで使用する場合は、次のスニペットをJSXファイルに追加します。

runCopyCSSFromScript = true; 
if (typeof cssToClip == "undefined")
    $.evalFile( app.path + "/" + localize("$$$/ScriptingSupport/Required=Required") + "/CopyCSSToClipboard.jsx" );

また、の下部にはCopyCSSToClipboard.jsx、へのサンプル呼び出しがありますcssToClip.dumpLayerAttr。これは、PhotoshopDOMからアクセスできないスクリプトからアクセスする可能性のあるパラメーターを調べるのに便利な方法です。

Requiredフォルダー内のコードは、将来のバージョンで変更される可能性があることに注意してください。

于 2013-04-11T22:48:43.453 に答える
0

C#とphotoshop COMラッパーを使用して、アクション内のすべてのデータのツリーをダンプするActionPrinterメソッドを作成することができました。

PrintCurrentLayerメソッドは、すべてのレイヤー効果データを含む、レイヤー内のすべてのデータをダンプします。

    static void PrintCurrentLayer(Application ps)
    {
        var action = new ActionReference();
        action.PutEnumerated(ps.CharIDToTypeID("Lyr "), ps.CharIDToTypeID("Ordn"), ps.CharIDToTypeID("Trgt"));
        var desc = ps.ExecuteActionGet(action);//.GetObjectValue(ps.StringIDToTypeID("layerEffects"));//.getObjectValue(ps.StringIDToTypeID('dropShadow'));
        ActionPrinter(desc);
    }

    static void ActionPrinter(ActionDescriptor action)
    {
        for (int i = 0; i < action.Count; i++)
        {
            var key = action.GetKey(i);

            if (action.HasKey(key))
            {
                //var charId = action.Application.TypeIDToCharID((int)key);
                //Debug.WriteLine(charId);

                switch (action.GetType(key))
                {
                    case PsDescValueType.psIntegerType:
                        Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetInteger(key));
                        break;
                    case PsDescValueType.psStringType:
                        Debug.WriteLine("{0}: \"{1}\"", (PSConstants)key, action.GetString(key));
                        break;
                    case PsDescValueType.psBooleanType:
                        Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetBoolean(key));
                        break;
                    case PsDescValueType.psDoubleType:
                        Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetDouble(key));
                        break;
                    case PsDescValueType.psUnitDoubleType:
                        Debug.WriteLine("{0}: {1} {2}", (PSConstants)key, action.GetUnitDoubleValue(key), (PSConstants)action.GetUnitDoubleType(key));
                        break;
                    case PsDescValueType.psEnumeratedType:
                        Debug.WriteLine("{0}: {1} {2}", (PSConstants)key, (PSConstants)action.GetEnumerationType(key), (PSConstants)action.GetEnumerationValue(key));
                        break;
                    case PsDescValueType.psObjectType:
                        Debug.WriteLine($"{(PSConstants)key}: {(PSConstants)action.GetObjectType(key)} ");
                        Debug.Indent();
                        ActionPrinter(action.GetObjectValue(key));
                        Debug.Unindent();
                        break;
                    case PsDescValueType.psListType:
                        var list = action.GetList(key);
                        Debug.WriteLine($"{(PSConstants)key}: List of {list.Count} Items");
                        Debug.Indent();
                        for (int count = 0; count < list.Count; count++)
                        {
                            var type = list.GetType(count);
                            Debug.WriteLine($"{count}: {type} ");
                            Debug.Indent();
                            switch (type)
                            {
                                case PsDescValueType.psObjectType:
                                    ActionPrinter(list.GetObjectValue(count));
                                    break;
                                case PsDescValueType.psReferenceType:
                                    var reference = list.GetReference(count);
                                    Debug.WriteLine("    Reference to a {0}", (PSConstants)reference.GetDesiredClass());
                                    break;
                                case PsDescValueType.psEnumeratedType:
                                    Debug.WriteLine("    {0} {1}", (PSConstants)list.GetEnumerationType(count), (PSConstants)list.GetEnumerationValue(count));
                                    break;
                                default:
                                    Debug.WriteLine($"UNHANDLED LIST TYPE {type}");
                                    break;
                            }
                            Debug.Unindent();
                        }
                        Debug.Unindent();
                        break;
                    default:
                        Debug.WriteLine($"{(PSConstants)key} UNHANDLED TYPE {action.GetType(key)}");
                        break;
                }
            }
        }
    }
于 2015-08-25T15:34:05.267 に答える