2024年Photoshop脚本编程简介_ps脚本怎么写(4),2024年最新“金三银四”春招指南

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  1. app.activeDocument.activeLayer.opacity = 50;

你应该可以猜到,activeDocument和activelayer决定了当前选择的文件和图层。

你可以在“Adobe Photoshop CS6 JavaScript Scripting Reference”PDF文件中找到大部分的目标和它们的属性和方法的说明,或者在ExtendedScript Toolkit中通过前往help-object Model Viewer.

让我们来看看在一个真实的例子中是如何运行的。在接下来的段落中,我们将会基于一个动作写一段我们自己的代码。

用代码来重现自我旋转动作

几年前的圣诞节,我有一个想法就是用动作帮助我画一个雪花。

画雪花

1,首先画一支雪花的图案。

no-13

2,复制这一支,同时旋转一定的角度。

no14

3,重复第二步直到一个完整的圆。

no-15

手动去复制和旋转每一个元素非常麻烦,所以我想出了一个自动的动作(an action to automate it)去完成它。算法是这样的:

1,复制元素。

2,使用变化工具按照你所选择的角度去旋转这个元素。

3,复制图层。

4,使用“重复变换”功能。

5,重复动作4和5直到一个完整的圆。

非常不错!但是这个动作有一个缺点:根据你在第三步设定的角度数值的算法,你只能设定一定数量的雪花的分支。

回到当我还不是很熟悉脚本的时候,我做了几个版本的动作,每一种产生的雪花都是不同的分支数。

今天,我们将用你输入分支的数值的动态脚本来重绘这个动作,让我们开始吧。

算法

当你开始写脚本的时候,在挖掘代码本身之前先设定算法是个不错的主意。在我们的情况下,算法将会是这样的:

1,询问用户输入分支的数目。

2,计算旋转的角度。

3,通过第一步设定的数目来复制并旋转图层。

首先让我们从把当前或选定的图层作为变量保存起来,为了将来使用:

  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;

在JavaScript 中注意,你可以标记两条双斜线(//)做注解。注解被用来为未来相关部分的代码做解释但是不影响脚本的运行。

现在让我们回到我们的算法上。

1,要求用户输入

我们通过prompt(message,defaultvalue[,tittle])这个功能来获取用户的输入信息:。这个功能表明一个有 着”message”对话框和一个包含这”fefault value”的输入框。当用户点击“确定”,这个给你功能就回到输入值;因此,我们需要保存它为一个可是用的变量。

  1. // Ask user for input by showing prompt box and save inputted value to variable:
  2. var stemsAmount = prompt(“Processing “”+originalStem.name+”“\nHow many stems do you need?”, 12);

注意我使用了“orginalStem.name”在这段信息里面。所以对话框会现实所选择图层的名称。

在Mac OS X中,在信息中的第一行是宽的,作用是标题。因此,我们主要的信息应该在第二行。另起一行,输入“\n”.

在Windows中,你可以在功能中指定第三种参数来设定一个标题:

  1. // Ask user for input by showing prompt box and save inputted value to variable:
  2. var stemsAmount = prompt(“How many stems do you need?”, 12, "Processing "+originalStem.name);

如果我们在PS中运行这个代码,将会看到这样一个对话框:

no-19

当用户点击“确定”,输入值将会保存到stemsAmount变量中。如果用去点击“取消”,这个功能将会返回一个无效值。这个我们后面要使用到。

2,计算旋转的角度

为了计算旋转的角度,我们需要通过分支的数目来分360度(一个整圆):

  1. // Calculate the rotation angle
  2. var angle = 360 / stemsAmount;

3,复制和旋转

现在我们已经有了我们需要复制的分支的一切。为了这样去做,我们将使用“for”循环。它可以让我们按照我们想要的次数来反复的运行一段代码。我们的循环将会是这样的:

  1. for(var i = 1; i < stemsAmount; i++){
  2. // This code will run “stemAmount - 1” of times
  3. };

注意第一个在程序中的对象例子已经有了值为0,但是因为我们第一个图层已经在画布上了,我们从1开始这个循环。

为了辅助和旋转我们的图层,我们将会使用:duplicate()和rotate(angle,AnchorPosition)函数:在angle 里面被旋转图层的数目通过复制的指数相乘而得。 Anchorposition决定了哪个图层将会旋转的点。当你在PS中使用旋转工具的时候你可以看到这个点—它看起来是一个小小的加了十字的圆圈。在脚 本中,它仅有9个指定的值-i.e.9个位置的锚点:

no-22

在我们这个情况下,它是这个图层按钮的中心。BOTTOMCENTER. PS在这里或那里的一些功能上使用了很多其他的一些常量,你可以在”Adobe Photoshop CS6JavaScript Reference”PDF文件中的197页找到。因此我们的循环就是这个样子:

  1. // Duplicate and rotate layers:
  2. for(var i = 1; i < stemsAmount; i++){
  3. // Duplicate original layer and save it to the variable
  4. var newStem = originalStem.duplicate();
  5. // Rotate new layer
  6. newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  7. };

完整的代码就是下面这个样子,你可以试着运行:

  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;
  3. // Ask user for input by showing prompt box and save inputted value to variable:
  4. var stemsAmount = prompt(“Processing “”+originalStem.name+”“\nHow many stems do you need?”, 12);
  5. // Calculate the rotation angle:
  6. var angle = 360 / stemsAmount;
  7. // Duplicate and rotate layers:
  8. for(var i = 1; i < stemsAmount; i++){
  9. // Duplicate original layer and save it to the variable
  10. var newStem = originalStem.duplicate();
  11. // Rotate new layer
  12. newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  13. };

最后的润色

我通常会试着使用脚本来完成我的主要目的。当一切都正确的运行起来的时候,我将会开始优化代码。在我们这种情况下,我们需要确保用户在提示框中输入一个有效的数值—i.e.一个正整数,而且要大于1。

当然,为了不让PS疯掉,我们会限制分支的书目,我们规定,小于100.为了这么做, 当他们提交了一个无效的数值的时候 ,我们需要使用一个“while”循环来告诉用户一个错误的信息。而且这个提示框将会一直存在,直到用户输入一个有效值或者点击“取消”按钮。(记住如果 用户点击取消将会提示无效值)。

新的代码将会是这样的:

  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;
  3. // Ask user for input by showing prompt box and save inputted value to variable:
  4. var stemsAmount = prompt (“Processing “”+originalStem.name+”“\nHow many stems do you need? (From 2 to 100)”, 12);
  5. // Check that user entered a valid number and, if invalid, show error message and ask for input again
  6. while(isNaN(stemsAmount) || stemsAmount <= 0 || stemsAmount > 100){
  7. // If user clicks “Cancel” button, then exit loop
  8. if(stemsAmount == null) break;
  9. // Show error message…
  10. alert(“Please enter number in range from 2 to 100”);
  11. // …and ask for input again
  12. stemsAmount = prompt(“Processing “”+originalStem.name+”“\nHow many stems do you need? (From 2 to 100)”, 12);
  13. };
  14. // Run the copying process
  15. if(stemsAmount != null){
  16. // Calculate the rotation angle
  17. var angle = 360 / parseInt(stemsAmount);
  18. // Duplicate and rotate layers:
  19. for(var i = 1; i < stemsAmount; i++){
  20. // Duplicate original layer and save it to the variable
  21. var newStem = originalStem.duplicate();
  22. // Rotate new layer
  23. newStem.rotate(angle * i, AnchorPosition.BOTTOMCENTER);
  24. };
  25. };

你可能注意到:我们使用了“isNaN(value)”这个功能,它返回 “true”如果 “value”不是一个数字,同时当我们计算旋转的角度的时候,“parseInt(value)”把“value”转换成一个整数。

接下来我们要做的事情是管理图层,通过为它们增加一个索引来重命名我们的图层。同事也要确保我们不会把文件的图层搞乱,让我们把我们的分支编组。

为图层重命名不是一个很难的事情。我们只需要使用图层的“name”属性,然后为它们增加一个索引数字:

  1. // Add index to new layers
  2. newStem.name = originalStem.name + " " + (i+1);

PS应用程序界面里的编组被称为“LayerSet”,我们通过“layerSets”属性可以进入文件的所有编组。为了给文件增加一个新的组,我们需要称“layerSet”方法为“add()”:

  1. // Create a group for stems
  2. var stemsGroup = app.activeDocument.layerSets.add();
  3. stemsGroup.name = originalStem.name + " (“+stemsAmount+” stems)";

然后,为了把一个图层增加到组里面,我们会使用“move(relativeobject,ElementPlacement)”函数。请注 意,“move()”函数只是把图层移动到图层堆,而不是移动到画布上。(你可以用“trabslate(deltaX[,deltaY])”函数把图层 移动到画布上)

ElementPlacement是另外一个常量,这个常量决定我们怎样把的图层跟 relativeobject 关联在一起。在我们的案例里,我们使用ElementPlacement.INSIDE 把一个普通图层放进一个组里面:

  1. // Place original layer in group
  2. originalStem.move(stemsGroup, ElementPlacement.INSIDE);

我们使用 ElementPlacement.PLACEATEND.把每一个拷贝的新图层放在所有图层租的底部。结果就是我们的所有图层都是以上升的顺序排列,第一个图层在顶部,最后一个图层在底部:

  1. // Place new layer inside stems group
  2. newStem.move(stemsGroup, ElementPlacement.PLACEATEND);

你可以在”Adobe Photoshop CS6 Scripting Guide”Pdf文件中202页里,找到更多关于“ElementPlacement”的内容。

最终代码

这就是它!RotateMe.jsx已经完成。我们的最终代码看起来像这样:

[javascript] 
view plain
 copy

  1. // Save selected layer to variable:
  2. var originalStem = app.activeDocument.activeLayer;
  3. // Ask user for input by showing prompt box and save inputted value to variable:
  4. var stemsAmount = prompt (“Processing “”+originalStem.name+”“\nHow many stems do you need? (From 2 to 100)”, 12);
  5. // Check that user entered a valid number and, if invalid, show error message and ask for input again

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

error message and ask for input again

[外链图片转存中…(img-I42XTN5Q-1715625508424)]
[外链图片转存中…(img-N3tHBS9V-1715625508424)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值