【问题标题】:Getting text layer shadow parameters (ExtendScript CS5, Photoshop scripting)获取文本图层阴影参数(ExtendScript CS5、Photoshop 脚本)
【发布时间】:2012-10-29 08:55:31
【问题描述】:

有什么方法可以在 Adob​​e Photoshop CS5 中使用 ExtendScript 获取文本(或任何其他)图层阴影参数,以便进一步转换为类似文本字符串的 CSS3?

谢谢!

【问题讨论】:

    标签: extendscript photoshop-script


    【解决方案1】:

    可能不是您正在寻找的答案,但实际上无法从extendscript 访问图层样式的各个属性。 API(自 CS6 起)中唯一引用图层样式的方法是 ArtLayer.applyStyle(name)。您实际上必须在 Photoshop 中创建一个样式并按名称保存到调色板才能使用它。

    我唯一能想到的就是使用 C/C++ 实际解析在 adobe/Adobe Photoshop/presets/styles/ 中找到的 .asl 文件。这些文件包含几种以专有格式保存的图层样式。我还没有找到任何库来解析这些文件,但它们可能存在。

    【讨论】:

    • 谢谢。你证实了我发现的信息……这很可悲。我会再等 24 小时等待答案(希望仍然存在),然后我会发送奖励。
    【解决方案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”是您要读取的图层效果,例如“distance”是将返回的参数。其他图层效果和参数仅称为 eventids。如果您需要其他 eventid,请查看文档(文档不完整)。

    下一个 AM-Code 将检查是否有图层样式阴影。

    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更多。

    如果你找到了设置阴影的方法,而不设置其他参数,请告诉我...

    【讨论】:

    • 感谢您的帮助,效果很好!现在我正在尝试查找 'DropShadow' 值名称(例如 'distance')...好的,我会告诉你的
    【解决方案3】:

    如果您有 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,则需要按住 Control 键单击 Photoshop 应用程序图标并选择“显示包内容”以进入 Contents/Required 文件夹)。

    查找例程cssToClip.addDropShadow 以获取有关如何提取信息的示例。如果您想在自己的代码中使用 CopyCSSToClipboard.jsx 中的例程,请将以下 sn-p 添加到您的 JSX 文件中:

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

    另外,在CopyCSSToClipboard.jsx 的底部,有对cssToClip.dumpLayerAttr 的示例调用。这是探索您可能希望从脚本中访问的参数的有用方法,而这些参数无法从 Photoshop DOM 中访问。

    请注意,Required 文件夹中的代码可能会在未来版本中发生更改。

    【讨论】:

      【解决方案4】:

      我能够创建一个 ActionPrinter 方法,该方法使用 C# 和 photoshop COM 包装器将操作中的所有数据树转储出来。

      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;
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2017-10-05
        • 2013-01-12
        • 2018-11-07
        • 2015-02-19
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        相关资源
        最近更新 更多