Ausgabe
Ich suche nach einer Möglichkeit, mit Photoshop generierte Ebenen in After Effects zu importieren. Das Problem ist, dass unser Projekt erfordert, dass wir Ebenen als separate Dateien aus Photoshop exportieren und diese Dateien dann in After Effects importieren. Bei einer großen Anzahl von Ebenen und Szenen ist dies manuell nicht mehr zu handhaben. Ich suche nach einem Skript oder einer Möglichkeit, eines zu schreiben, um diesen Prozess zu automatisieren. Das Skript muss die Positionen der Ebenen in der ursprünglichen Photoshop-Datei übernehmen und die entsprechenden PNGs an denselben Positionen im After Effects-Projekt platzieren.
In diesem Video um 4:30 beginnt der Typ, ein Tool zu verwenden, das die von mir beschriebene Automatisierung verwaltet.
Irgendeine Idee, wie ich an ein solches Skript kommen kann?
Lösung
Der folgende Code funktioniert im Moment für mich. Ich hoffe, es kann Ihnen als Ausgangspunkt dienen. Bitte lassen Sie mich einige Anmerkungen zu bestimmten Zeilen hinzufügen:
1- Dateien ist der Ordner, in dem das Skript nach den Ebenen sucht. Dies sollte ein Ordner neben Ihrem .aep-Projekt sein (oder ändern Sie diese Zeile entsprechend).
10-46- Initialisierung einiger nützlicher Funktionen, zum Beispiel um eine Ordnerelementnummer oder -komposition basierend auf ihrem Namen zu erhalten. Diese werden hinzugefügt, falls Sie die fest codierten Werte ersetzen möchten (ich konnte es aus Zeitmangel nicht tun).
Bitte beachten Sie auch, dass die Zeilen 55, 68, 69 oder 72 die Artikelnummer der Zusammenstellung/des Ordners fest codiert haben. Dies bedeutet, dass dieses Skript funktioniert, solange das erste Element Ihres After Effects-Projekts eine Komposition und das zweite Element ein Ordner ist .
Zeile 58 fordert Sie auf, Ihre txt-Datei mit den Ebenennamen und -positionen einzugeben.
Ich denke, der Rest geht aus den Kommentaren ziemlich klar hervor, aber lassen Sie es mich wissen, wenn Sie weitere Fragen haben.
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
}
Müssen Sie den ursprünglichen Ankerpunkt jeder Ebene beibehalten? Denn es wäre einfach, Folgendes zu tun:
(Photoshop) Datei > Exportieren > Ebenen in Dateien…
Und speichern Sie jede Ebene in einem PNG in Leinwandgröße. Importieren Sie es dann per Stapelverarbeitung in eine Komposition mit einem After Effects-Skript. Das Problem ist, dass sich alle Ankerpunkte in der Mitte der Komposition befinden würden, was meiner Meinung nach nicht gut für Sie ist.
Eine andere Alternative wäre, die PSD-Datei direkt in After Effects zu importieren. Wenn Sie anstelle von Footage eine PSD-Datei als Komposition importieren und “Ebenengröße beibehalten” auswählen, erhalten Sie jede PSD-Ebene in einer After Effects-Ebene und korrekt positioniert. Ist dies keine Option für Ihren Anwendungsfall?
Beantwortet von – sqr
Antwort geprüft von – David Goodson (FixError Volunteer)