用于将 PNG 文件导入为图层的 Adobe After Effects 脚本
Adobe After Effects script for importing PNG files as layers
我正在寻找一种将 Photoshop 生成的图层导入 After Effects 的方法。问题是我们的项目要求我们将图层作为单独的文件从 Photoshop 导出,然后将这些文件导入 After Effects。对于大量的图层和场景,这变得无法手动处理。我正在寻找一个脚本或一种编写脚本来自动执行此过程的方法。该脚本需要获取原始 Photoshop 文件中图层的位置,并将相应的 PNG 文件放入 After Effects 项目的相同位置。
在 4:30 的 this 视频中,这个人开始使用我描述的管理自动化的工具。
知道如何获得这样的脚本吗?
以下代码目前对我有用。我希望它可以作为你的起点。请让我在某些行上添加一些注释:
1- files 是脚本将在其中查找图层的文件夹。这应该是您的 .aep 项目旁边的文件夹(或相应地更改此行)。
10-46- 初始化一些有用的功能,例如根据其名称获取文件夹项目编号或 comp。如果您想替换硬编码值(由于时间不够,我无法做到),添加这些值。
另请注意,第 55、68、69 或 72 行的项目编号 composition/folder 已硬编码。 这意味着只要您的 After Effects 项目第一项是合成文件并且第二项是文件夹.
第 58 行提示输入包含图层名称和位置的 txt 文件。
我认为评论中的其余部分已经很清楚了,但如果您还有其他问题,请告诉我。
var originFolder = "\files";
var path = app.project.file.path;
var originFolderPath = Folder(path + originFolder);
var originFolderFiles = originFolderPath.getFiles();
var myProject = app.project;
// Functions to handle the importing of files and folders
function processFile(theFile) {
try {
var importOptions = new ImportOptions(theFile);
importSafeWithError(importOptions);
} catch (error) {
}
}
function importSafeWithError(importOptions) {
try {
app.project.importFile(importOptions);
} catch (error) {
alert(error.toString() + importOptions.file.fsName, scriptName);
}
}
function processFolder(folder) {
var filesInFolder = folder.getFiles();
for (index in filesInFolder) {
if (filesInFolder[index] instanceof File) {
processFile(filesInFolder[index]);
}
}
}
function getFolderByName(folderName) { // Given a folder name, returns the item index in the project
for (var i = 1; i <= myProject.numItems; i++) {
if ((myProject.item(i) instanceof FolderItem) && (myProject.item(i).name == folderName)){
return myProject.item(i);
}
}
}
function getCompByName(compName) { // Given a folder name, returns the item index in the project
for (var i = 1; i <= myProject.numItems; i++) {
if ((myProject.item(i) instanceof CompItem) && (myProject.item(i).name == compName)){
return myProject.item(i);
}
}
}
// Fun starts here
processFolder(originFolderPath); // Import the files of the folder originFolder
for (var i = 1; i <= myProject.numItems; i++) { // Put the imported files inside item(2) --> folder
if (myProject.item(i) instanceof FootageItem) {
myProject.item(i).parentFolder = myProject.item(2); // Note that the folder must be item(2)
}
}
var textFile = File.openDialog("Select text file."); // select the text file you want to open
if (textFile != null){
textFile.open("r");
}
var text;
while (!textFile.eof){
text = textFile.readln();
}
var textArr = text.split(', '); // Separate the different values in an array
for (var i = 1; i <= myProject.item(2).numItems; i++){ // Add the layers to the comp
myProject.item(1).layers.add(myProject.item(2).item(i)); // Note that the comp must be item(1)
}
comp = myProject.item(1); // Setting the comp that contains our layers
for (var i = 1; i<= comp.numLayers; i++){ // Flipping the layer order so Layer 1 is the first one
comp.layer(i).moveToBeginning();
}
u = 0;
for (var i = 1; i <= comp.numLayers; i++){ // Setting the position of each layer
u = u+3; // Skipping every 3rd item to ignore the "Layer X" values on the txt file
var posArr = [0,0]; // Create a new array for the position of the layer
origX = parseInt(u-2); // Select the appropiate item of the array, skipping "Layer X"
origY = parseInt(u-1);
posArr[0] = textArr[origX];
posArr[1] = textArr[origY];
layer = comp.layer(i);
layer.property("Position").setValue(posArr); // Applying the new X,Y array to the position value
}
是否需要保留每一层的原始锚点?因为执行以下操作很容易:
(Photoshop) 文件 > 导出 > 图层到文件...
并将每一层保存为 canvas 大小的 png。然后将其批量导入到带有 After Effects 脚本的合成中。问题是所有的锚点都在构图的中心,我猜这对你不好。
另一种方法是直接在 After Effects 中导入 PSD 文件。如果您将 PSD 文件作为合成而不是素材和 select "Retain Layer size" 导入,您将在 After Effects 图层中获得每个 PSD 图层并正确定位。这不是您的用例的选项吗?
我正在寻找一种将 Photoshop 生成的图层导入 After Effects 的方法。问题是我们的项目要求我们将图层作为单独的文件从 Photoshop 导出,然后将这些文件导入 After Effects。对于大量的图层和场景,这变得无法手动处理。我正在寻找一个脚本或一种编写脚本来自动执行此过程的方法。该脚本需要获取原始 Photoshop 文件中图层的位置,并将相应的 PNG 文件放入 After Effects 项目的相同位置。
在 4:30 的 this 视频中,这个人开始使用我描述的管理自动化的工具。
知道如何获得这样的脚本吗?
以下代码目前对我有用。我希望它可以作为你的起点。请让我在某些行上添加一些注释:
1- files 是脚本将在其中查找图层的文件夹。这应该是您的 .aep 项目旁边的文件夹(或相应地更改此行)。
10-46- 初始化一些有用的功能,例如根据其名称获取文件夹项目编号或 comp。如果您想替换硬编码值(由于时间不够,我无法做到),添加这些值。
另请注意,第 55、68、69 或 72 行的项目编号 composition/folder 已硬编码。 这意味着只要您的 After Effects 项目第一项是合成文件并且第二项是文件夹.
第 58 行提示输入包含图层名称和位置的 txt 文件。
我认为评论中的其余部分已经很清楚了,但如果您还有其他问题,请告诉我。
var originFolder = "\files";
var path = app.project.file.path;
var originFolderPath = Folder(path + originFolder);
var originFolderFiles = originFolderPath.getFiles();
var myProject = app.project;
// Functions to handle the importing of files and folders
function processFile(theFile) {
try {
var importOptions = new ImportOptions(theFile);
importSafeWithError(importOptions);
} catch (error) {
}
}
function importSafeWithError(importOptions) {
try {
app.project.importFile(importOptions);
} catch (error) {
alert(error.toString() + importOptions.file.fsName, scriptName);
}
}
function processFolder(folder) {
var filesInFolder = folder.getFiles();
for (index in filesInFolder) {
if (filesInFolder[index] instanceof File) {
processFile(filesInFolder[index]);
}
}
}
function getFolderByName(folderName) { // Given a folder name, returns the item index in the project
for (var i = 1; i <= myProject.numItems; i++) {
if ((myProject.item(i) instanceof FolderItem) && (myProject.item(i).name == folderName)){
return myProject.item(i);
}
}
}
function getCompByName(compName) { // Given a folder name, returns the item index in the project
for (var i = 1; i <= myProject.numItems; i++) {
if ((myProject.item(i) instanceof CompItem) && (myProject.item(i).name == compName)){
return myProject.item(i);
}
}
}
// Fun starts here
processFolder(originFolderPath); // Import the files of the folder originFolder
for (var i = 1; i <= myProject.numItems; i++) { // Put the imported files inside item(2) --> folder
if (myProject.item(i) instanceof FootageItem) {
myProject.item(i).parentFolder = myProject.item(2); // Note that the folder must be item(2)
}
}
var textFile = File.openDialog("Select text file."); // select the text file you want to open
if (textFile != null){
textFile.open("r");
}
var text;
while (!textFile.eof){
text = textFile.readln();
}
var textArr = text.split(', '); // Separate the different values in an array
for (var i = 1; i <= myProject.item(2).numItems; i++){ // Add the layers to the comp
myProject.item(1).layers.add(myProject.item(2).item(i)); // Note that the comp must be item(1)
}
comp = myProject.item(1); // Setting the comp that contains our layers
for (var i = 1; i<= comp.numLayers; i++){ // Flipping the layer order so Layer 1 is the first one
comp.layer(i).moveToBeginning();
}
u = 0;
for (var i = 1; i <= comp.numLayers; i++){ // Setting the position of each layer
u = u+3; // Skipping every 3rd item to ignore the "Layer X" values on the txt file
var posArr = [0,0]; // Create a new array for the position of the layer
origX = parseInt(u-2); // Select the appropiate item of the array, skipping "Layer X"
origY = parseInt(u-1);
posArr[0] = textArr[origX];
posArr[1] = textArr[origY];
layer = comp.layer(i);
layer.property("Position").setValue(posArr); // Applying the new X,Y array to the position value
}
是否需要保留每一层的原始锚点?因为执行以下操作很容易:
(Photoshop) 文件 > 导出 > 图层到文件...
并将每一层保存为 canvas 大小的 png。然后将其批量导入到带有 After Effects 脚本的合成中。问题是所有的锚点都在构图的中心,我猜这对你不好。
另一种方法是直接在 After Effects 中导入 PSD 文件。如果您将 PSD 文件作为合成而不是素材和 select "Retain Layer size" 导入,您将在 After Effects 图层中获得每个 PSD 图层并正确定位。这不是您的用例的选项吗?