After Effects 自动导入素材和分类的脚本

最近一个游戏项目需要用到AE做合成,可是渲出来的素材有那么多层,艺术家自己一个一个往里导确实很费时间,于是给他们写了个自动导入素材的工具,并且根据背景和角色层自动打好组,创建文件夹,还创建了comp,将素材放进去,根据序列的长度来设置comp的长度,还能根据文件的名字给里面的comp命名,将文件命名规范,最后又加了个为艺术家自动设置输出路径和视频名字的功能。
工具的界面如下:
在这里插入图片描述

原码如下:

{
    function importFile(file){
        try{
            var importOptions = new ImportOptions(file);
            app.project.importFile(importOptions);
        }
        catch(error){}
    }


    function detectForSequence(files){
        var searcher = new RegExp("[0-9]+");
        var imageFileSearcher = new RegExp("(mov|avi|mpg)$", "i");
        var parseResults = new Array;
        var parseNum = new Array;

        for (var i=0; i < files.length; i++){
            var imageFileResult = imageFileSearcher.exec(files[i].name);
            if (!imageFileResult){
                var currentResult = searcher.exec(files[i].name);
                parseNum.push(currentResult);
                if (currentResult){
                    parseResults[parseResults.length] = currentResult[0];
                }
                else{
                    parseResults[parseResults.length] = null;
                }
            }else{
                parseResults[parseResults.length] = null;
            }

        }

        parseNum.sort();
        difference = parseNum[parseNum.length - 1] - parseNum[0] + 1
        if (difference == parseNum.length & parseNum.length > 1){
            return files[0];
        }else{
            return null;
        }

        // var result = null;
        // for (var i=0; i < parseResults.length; ++i){
        //     if (parseResults[i]){
        //         if (!result){
        //             result = files[i];
        //         }
        //     }
        //     else{
        //         result = null;
        //         break;
        //     }
        // }
        // return parseNum;
        // return result;
    }


    function processFolder(folderPath, value){
        var files = folderPath.getFiles();
        var sequenceStartFile = detectForSequence(files);
        value.push(files.length);

        if (sequenceStartFile){
            try{
                var importOptions = new ImportOptions(sequenceStartFile);
                importOptions.sequence = true;
                var importImg = app.project.importFile(importOptions);
                importImg.conformFrameRate = 24;
            } catch (error){ /*alert(error.line.toString() + "v" + error.toString())*/

            }
        }

        for (var i = 0; i < files.length; i++) {
            if (files[i] instanceof File){
                if (!sequenceStartFile){
                    importFile(files[i]);
                }
            }

            if (files[i] instanceof Folder){
                processFolder(files[i], value);
            }
        }

    }


    function findItemIndexFromSelection(){
        var index = null;
        selected = app.project.selection;
        if (!selected){
            alert("Please select one item at least")
        }
        firstSelectedName = selected[0].name;
        allItems = app.project.items;
        for (var i = 1; i < allItems.length; i++) {
            itemName = allItems[i].name;
            if (itemName == firstSelectedName){
                index = i;
                break;
            }
        }
        return index;
    }


    function getItemSize(index){
        var itemWidth = app.project.item(index).width;
        var itemHeight = app.project.item(index).height;
        return [itemWidth, itemHeight];
    }


    function getItemDuration(index){
        var duration = app.project.item(index).duration;
        var frameRate = app.project.item(index).frameRate;
        var length = duration * frameRate;

        if (length == 0)
            return 150;
        else
            return length;
    }


    function getItemByName(name){
        for (var i=1; i<app.project.numItems; i++){
            if (app.project.item(i).name == name){
                    return app.project.item(i);
            }
        }
    }


    function deleteItemByName(name){
        try{
            var item = getItemByName(name);
            item.remove();
        } catch(error){}

    }


    function createComp(compName, compParent, compSize, compLength){
        var comp = app.project.items.addComp(compName, compSize[0], compSize[1], 1, compLength/24, 24);
        comp.parentFolder = compParent;
        var selected_num = app.project.selection.length;
        var seledcted_items = app.project.selection;

        for (var i = 0; i < selected_num; i++) {
            item = seledcted_items[i];
            comp.layers.add(item);
            item.parentFolder = compParent;
            item.selected = false;
        }
        return comp;
    }


    function createFolderForCG(path){
        var folder_path = Folder(path);
        var files = folder_path.getFiles()
        var result = new Array;
        var parent = getItemByName("02)CG");

        for (var i = 0; i < files.length; i++) {
            var folder_name = "CHR_" + files[i].name;
            var folder_item = app.project.items.addFolder(folder_name);
            folder_item.parentFolder = parent;
            var path_comp_grp = [folder_name, files[i]];
            result.push(path_comp_grp);
        }
        // alert(result);
        return result;
    }


    function processBG(path){
        app.beginUndoGroup("Process BG");

        deleteItemByName('BG_00_015')
        var num_value = new Array;
        processFolder(Folder(path), num_value);

        var index = findItemIndexFromSelection();
        var widthHeight = getItemSize(index);
        var length = getItemDuration(index);
        var project_name = app.project["file"].name;
        var first = project_name.indexOf("_");
        var last = project_name.lastIndexOf("_");
        var valid_part = project_name.substring(first, last - 2);
        var BG_comp_name = "BG" + valid_part.substr(0, valid_part.length - 1) 
        BGFolder = getItemByName("BG");

        createComp(BG_comp_name, BGFolder, widthHeight, length)

        app.endUndoGroup();
    }


    function processCG(path){
        app.beginUndoGroup("Process CG");

        deleteItemByName('CHR_XXX');

        character_folder_path = createFolderForCG(path);
        for (var i = 0; i < character_folder_path.length; i++) {
            var folder_path = character_folder_path[i];
            var num_value = new Array;
            processFolder(Folder(folder_path[1]), num_value);
            length = num_value[num_value.length - 1];
            var CGFolder = getItemByName(folder_path[0])
            var index = findItemIndexFromSelection();
            var widthHeight = getItemSize(index);
            // var length = getItemDuration(index);
            var CH_name = folder_path[0]
            createComp(CH_name, CGFolder, widthHeight, length)

        }

        app.endUndoGroup();
    }


    function alterCompName(){
        app.beginUndoGroup("Alter Comp Name");

        var comp_item = getItemByName("KGA_00_000_L1_01");
        var project_name = app.project["file"].name;
        var dot_index = project_name.indexOf(".");
        var main_comp = project_name.substr(0, dot_index)
        comp_item.name = main_comp;

        app.endUndoGroup();
    }


    function alterOutputCompName(){
        app.beginUndoGroup("Alter Output CompName");

        var comp_item = getItemByName("KGA_00_000_L1");
        var project_name = app.project["file"].name;
        var last = project_name.lastIndexOf("_");
        var output_comp_name = project_name.substr(0, last);
        comp_item.name = output_comp_name;

        app.endUndoGroup();
    }


    function importResourses(){
        var folder_path = Folder.selectDialog ("Choose a source folder.");
        if (folder_path != null){
            if (!app.project){
                app.newProject();
            }

            var files = folder_path.getFiles();
            for (index in files){
                if (files[index].name == "BG"){
                    processBG(files[index]);
                }
                if (files[index].name == "CH"){
                    processCG(files[index]);
                }
            }
            alert("Finish importing");

        }

        alterCompName();
        alterOutputCompName();
    }


    function createRenderQueue(){

        app.beginUndoGroup("Create Render Queue");

        var qtemplate = "H.264";
        var project_path = app.project["file"].path;
        var project_name = app.project["file"].name;
        var output_path = project_path + "/" + project_name.replace('aep', 'mp4');

        var activeItem = app.project.activeItem;
        if(activeItem != null && activeItem instanceof CompItem){
            var theRender = app.project.renderQueue.items.add(activeItem);
            theRender.outputModules[1].applyTemplate(qtemplate);
            if (theRender.status == RQItemStatus.QUEUED){
                for (j = 1; j <= theRender.numOutputModules; ++j) {
                var curOM = theRender.outputModule(j);
                curOM.file = new File(output_path);
                    
                }

            }
        }

        app.endUndoGroup();

    }


    function initUI(thisObj){

        UIunit=5;
        UIwidth=175;
        UIheight=UIunit*18;

        var pal = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Create Comp", [0, 0, UIwidth, UIheight]);
        // UI.main = new Window("palette", "Create Comp", undefined, {resizeable:true});  //[0, 0, UIwidth, UIheight]{resizeable:true}
        var createCompButton = pal.add("button", [UIunit,UIunit*1,UIwidth-UIunit,UIunit*8.5], "Import Resources");
        var createRenderQueueButton = pal.add("button", [UIunit, UIunit*10, UIwidth-UIunit,UIunit*17], "Create Render Queue");
        
        if (pal instanceof Window)
        {
            pal.center();
            pal.show();
        }
        else
        {
            pal.layout.layout(true);
        }  
        // UI.main.center();
        // UI.main.show();

        createCompButton.onClick = importResourses;

        createRenderQueueButton.onClick = createRenderQueue;

    }


    // var UI = new Object();
    initUI(this);


}



https://pan.baidu.com/s/1InKBj4CBr3YXgoiQmFtRKw

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
After Effects 中可以使用脚本编写自定义的图像处理算法,其中包括了使用模板匹配处理图像的功能。下面是一个简单的模板匹配处理图像的脚本: ```javascript // 获取当前项目中选中的图层 var selectedLayer = app.project.activeItem.selectedLayers[0]; // 获取图层的源素材 var source = selectedLayer.source; // 获取图层的宽度和高度 var width = source.width; var height = source.height; // 创建一个新的合成 var comp = app.project.items.addComp('Temp Comp', width, height, 1.0, source.duration, source.frameRate); // 在新的合成中添加一个空白的图层 var solidLayer = comp.layers.addSolid([1, 1, 1], 'Solid Layer', width, height, 1.0, source.duration); // 将源素材复制到新的图层中 var sourceLayer = solidLayer.source; sourceLayer.replaceSource(source, false); // 创建一个新的图像处理器 var processor = new ImageProcessor(width, height); // 获取模板图像 var template = new Image(); template.load('template.png'); // 在图像中查找模板 var result = processor.matchTemplate(sourceLayer, template, 0.8); // 将模板匹配的结果应用到新的图层中 var effect = solidLayer.Effects.addProperty('Paint'); effect.property('Stroke Width').setValue(10); effect.property('Color').setValue([1, 0, 0]); effect.property('Start Point').setValue(result.x, result.y); effect.property('End Point').setValue(result.x + template.width, result.y); // 将新的合成添加到当前项目中 app.project.activeItem.layers.add(comp); ``` 在这个脚本中,首先获取当前项目中选中的图层,然后创建一个新的合成和一个空白的图层。接着,将源素材复制到新的图层中,并且创建一个新的图像处理器。在图像处理器中,通过调用 `matchTemplate` 方法,使用模板匹配来查找图像中的模板,并返回匹配结果。最后,将模板匹配的结果应用到新的图层中,将新的合成添加到当前项目中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值