用于将 PNG 文件导入为图层的 Adob​​e 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 图层并正确定位。这不是您的用例的选项吗?