来源
https://www.motionboutique.com
用法
执行脚本,然后在电脑上选择一个图像文件夹。还是可以研究下源码的
源码
// PanZoom.jsx
// Copyright (c) 2011 Motion Boutique
function createPanZoom(comp, layer) {
var rulesOfThirdsPoints = [[1 / 3, 1 / 3], [2 / 3, 1 / 3], [1 / 3, 2 / 3], [2 / 3, 2 / 3]]; // points of interest in image
var zoomModes = ["IN", "OUT"];
var rdIdx = Math.floor(Math.random() * rulesOfThirdsPoints.length);
var f = rulesOfThirdsPoints[rdIdx];
var deltaZoomPoint = [f[0] * comp.width, f[1] * comp.height] - [comp.width / 2, comp.height / 2];
var rdIdx = Math.floor(Math.random() * zoomModes.length);
var zoomMode = zoomModes[rdIdx];
var keyTimes = [panZoomStart, panZoomEnd];
var keyValues;
switch (zoomMode) {
case "IN":
keyValues = [[100, 100], [150, 150]];
break;
case "OUT":
keyValues = [[150, 150], [100, 100]];
break;
default:
break;
}
var nullL = comp.layers.addNull();
layer.scale.expression =
"sx = 100 * thisComp.width / width; \r" +
"sy = 100 * thisComp.height / height; \r" +
"s = Math.max(sx,sy); \r" +
"[s,s];";
layer.parent = nullL;
nullL.anchorPoint.setValue(nullL.anchorPoint.value + deltaZoomPoint);
nullL.position.setValue(nullL.position.value + deltaZoomPoint);
nullL.scale.setValuesAtTimes(keyTimes, keyValues);
}
function isInArray(array, element) {
var found = false;
for (var i = 0; !found && i < array.length; i++) {
if (array[i] == element) found = true;
}
return found;
}
function isImageFile(fileName) {
var ext = fileName.split(".").pop().toUpperCase();
var imageFormats = ["BMP", "CIN", "IIF", "EXR", "GIF", "JPG", "JPEG", "PCX", "PCT", "PNG", "PSD", "PXR", "HDR", "SGI", "TIF", "TGA", "MP4"];
return isInArray(imageFormats, ext);
}
function run() {
var imagesFolder = defaultFolder.selectDlg("Select images folder:");
if (imagesFolder) {
defaultFolder = imagesFolder;
app.beginUndoGroup("PanZoom.jsx");
var assetFolder = app.project.items.addFolder("PanZoom Assets - " + File.decode(imagesFolder.name));
var comps = [];
var files = imagesFolder.getFiles();
clearOutput();
for (var i = 0; i < files.length; i++) {
if (isImageFile(files[i].fsName)) {
clearOutput();
var io = new ImportOptions();
var item;
try {
io.file = files[i];
if (io.canImportAs(ImportAsType.FOOTAGE)) {
io.importAs = ImportAsType.FOOTAGE;
}
item = app.project.importFile(io);
}
catch (e) {
//alert("File cannot be imported: " + files[i].fsName + ". It will replaced with a placeholder.");
item = app.project.importPlaceholder(files[i].name, 1920, 1080, 25, 3600);
}
if (item) {
item.selected = false;
var comp = app.project.items.addComp(item.name, item.width, item.height, item.pixelAspect, panZoomEnd - panZoomStart, 25);
var layer = comp.layers.add(item);
createPanZoom(comp, layer);
item.parentFolder = assetFolder;
comp.parentFolder = assetFolder;
comps.push(comp);
}
}
}
// create final comp
if (comps.length > 0) {
var finalComp = app.project.items.addComp("Final - " + File.decode(imagesFolder.name), 1280, 720, 1, 1000, 25);
for (var i = 0; i < comps.length; i++) {
var layer = finalComp.layers.add(comps[i]);
layer.scale.expression =
"sx = 100 * thisComp.width / width; \r" +
"sy = 100 * thisComp.height / height; \r" +
"s = Math.max(sx,sy); \r" +
"[s,s];";
layer.startTime = i * (panZoomEnd - panZoomStart);
var keyTimes = [i * (panZoomEnd - panZoomStart), i * (panZoomEnd - panZoomStart) + 0.5,
(i + 1) * (panZoomEnd - panZoomStart) - 0.5, (i + 1) * (panZoomEnd - panZoomStart)];
var keyValues = [0, 100, 100, 0];
layer.opacity.setValuesAtTimes(keyTimes, keyValues);
}
finalComp.workAreaDuration = Math.max(finalComp.frameDuration, i * (panZoomEnd - panZoomStart));
}
if (assetFolder.numItems < 1)
assetFolder.remove();
app.endUndoGroup();
}
}
var panZoomStart = 0; // in seconds
var panZoomEnd = 3;
var defaultFolder;
if (defaultFolder == null) {
defaultFolder = Folder.current;
}
run();