Skrip Adobe After Effects untuk mengimpor file PNG sebagai lapisan

Saya mencari cara untuk mengimpor lapisan yang dihasilkan Photoshop ke After Effects. Masalahnya adalah proyek kita mengharuskan kita mengekspor lapisan sebagai file terpisah dari Photoshop dan kemudian mengimpor file tersebut ke efek setelahnya. Dengan banyaknya lapisan dan pemandangan, hal ini menjadi mustahil untuk ditangani secara manual. Saya mencari skrip atau cara menulisnya untuk mengotomatisasi proses ini. Script perlu mengambil lokasi lapisan dalam file Photoshop asli dan menempatkan PNG yang sesuai ke dalam proyek After Effects di posisi yang sama.

Dalam video ini pada pukul 4:30, pria tersebut mulai menggunakan alat yang mengelola otomatisasi yang saya jelaskan .

Adakah yang tahu bagaimana saya bisa mendapatkan skrip seperti itu?


person OwlOnMoon    schedule 17.11.2019    source sumber


Jawaban (1)


Kode berikut berfungsi saat ini untuk saya. Saya harap ini bisa menjadi titik awal bagi Anda. Tolong izinkan saya menambahkan beberapa catatan pada baris tertentu:

1- file adalah folder tempat skrip akan mencari lapisan. Ini harus berupa folder di sebelah proyek .aep Anda (atau ubah baris ini sesuai kebutuhan).

10-46- Menginisialisasi beberapa fungsi yang berguna, misalnya untuk mendapatkan nomor item folder atau comp berdasarkan namanya. Ini ditambahkan jika Anda ingin mengganti nilai hardcode (saya tidak dapat melakukannya karena kurangnya waktu).

Harap perhatikan juga bahwa baris 55, 68, 69 atau 72 memiliki nomor item komposisi/folder yang dikodekan secara keras. Ini berarti skrip ini akan berfungsi selama item pertama proyek after effect Anda adalah comp dan item kedua adalah folder.

Baris 58 meminta untuk memasukkan file txt Anda dengan nama dan posisi layer.

Saya pikir sisanya cukup jelas dari komentar tetapi beri tahu saya jika Anda memiliki pertanyaan lebih lanjut.

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
}

Apakah Anda perlu mempertahankan titik jangkar asli setiap lapisan? Karena akan mudah untuk melakukan hal berikut:

(Photoshop) File > Ekspor > Lapisan ke file...

Dan simpan setiap lapisan ke png berukuran kanvas. Kemudian impor batch ke dalam komposisi dengan skrip After Effects. Masalahnya adalah semua titik jangkar berada di tengah komposisi, yang menurut saya tidak baik untuk Anda.

Alternatif lain adalah dengan langsung mengimpor file PSD di After Effects. Jika Anda mengimpor file PSD sebagai Komposisi, bukan Footage, dan memilih "Pertahankan ukuran Lapisan", Anda akan mendapatkan setiap lapisan PSD dalam lapisan After Effects dan diposisikan dengan benar. Apakah ini bukan pilihan untuk kasus penggunaan Anda?

person sqr    schedule 20.11.2019
comment
Ya jadi masalahnya adalah proyek saya mengharuskan PNG diimpor ke After Effects dan bukan PSD dengan Retain Layer Size. Jadi tidak, itu bukan pilihan bagiku. Saya mencari skrip untuk melakukan impor batch dengan posisi dan ukuran dipertahankan. Saya telah menulis skrip yang mengekstrak koordinat lapisan di PSD dan kemudian mengekspor lapisan PNG. Sekarang saya membutuhkan bagian kedua. Terima kasih! - person OwlOnMoon; 20.11.2019
comment
Saya rasa saya mungkin dapat membantu Anda dengan bagian kedua itu, karena saya telah melakukan hal serupa sebelumnya. Di mana Anda menyimpan koordinat setiap lapisan? - person sqr; 20.11.2019
comment
Dalam file txt, di mana setiap lapisan memiliki x dan y sebagai nilai yang dipisahkan koma - person OwlOnMoon; 20.11.2019
comment
apakah Anda menyertakan nama lapisan pada txt atau hanya nilai X,Y setiap lapisan? Jika Anda dapat memberikan contoh txt, saya mungkin dapat memberi Anda kode yang langsung berfungsi dengan efek setelahnya untuk menangani impor. - person sqr; 22.11.2019
comment
Ya, itu akan sangat bagus! Saya menyertakan namanya dan berikut tampilannya: Layer 2,1125,169 Layer 1,87,327 Background,0,0 - person OwlOnMoon; 22.11.2019
comment
@OwlOnMoon Saya telah mengedit jawaban asli saya dengan skrip, tidak sesuai dengan bagian komentar. - person sqr; 25.11.2019
comment
Ya, saya sendiri membuat skrip serupa dan berhasil. Tapi terima kasih, saya akan menandainya dengan benar. - person OwlOnMoon; 25.11.2019