我的许多工作都很难以书的形式进行,因为它的视频,动画交互代码或大数据集中的模式和对象识别。 因此,我发现自己拥有成千上万张图像,但是没有一个图像能够完整地讲述有关该作品的故事。 因此,我决定通过使用自定义脚本来自动安排书籍的版式,来创建此作品的目录,以按顺序显示所有图像。
现有的大多数制书工具都相对较差。 InDesign允许您生成图像目录,但是策展和控制的数量非常有限,而且很不幸,它可能会出现故障。 我将Processing与一些自定义Java脚本一起使用来创建此自定义目录:
步骤1:从电影创建图像
首先,我需要以有趣的帧频从电影中获得一系列图像。 我不希望这些框架出现得太频繁,因为这会使我的目录太长而无聊。 我将每部电影导入After Effects,并将帧频更改为非常低的水平。 通常,默认值为每秒30帧。 对于6分钟的视频来说,这就是很多帧(30帧X 360秒= 10,800)! 我试图将我的大多数电影保持在200-1500张最终图像之间。 我的最后一页每页大约有50张图像。 更改视频的帧频后,我将JPEG序列导出到文件夹。


原始视频:
步骤2:批处理映像重命名
我要做的下一件事是使用Bridge批量重命名图像。


步骤3:创建名称索引
我想将图像与标题配对。 因此,我创建了一个Excel文件,以便可以快速创建图像的名称。 对于此视频,我使用每个图像的时间戳作为标题。 然后,我将其导出到CSV,以便可以将其导入到用于创建目录页面的脚本中。


步骤4:创建目录页面
我在处理Java模式下使用了此脚本。 该脚本是在Spatial Pixel的Allan William Martin的帮助下创建的。
需要注意的一些事项:
CSV文件必须位于带有标题的数据文件夹中。
字体将需要根据您有权访问的字体进行更新。
表数据; PGraphics contactSheet; PImage全景图; PFont neutraFont; PFont courierFont; void setup(){size(100,100); neutraFont = createFont(“ KozMinPr6N-Heavy”,40); courierFont = createFont(“ Courier New”,23); // textSize(30); int thumbnailWidth = 328; int thumbnailHeight = 242; int PanoramasPerSheet = 48; int numColumns = 6; 整数保证金= 30; //每个图片之间的像素数。 300像素== 1英寸。 int contactSheetWidth = thumbnailWidth * numColumns +边距*(numColumns-1); int contactSheetHeight =(缩略图高度+边距)*(panoramasPerSheet / numColumns); contactSheet = createGraphics(contactSheetWidth,contactSheetHeight); color backgroundColor = color(255); contactSheet.beginDraw(); contactSheet.background(backgroundColor); contactSheet.endDraw(); 字符串thumbnailName =“ dm”; //每个全景图片的前缀String setName =“ dm”; //“数据”文件夹中的文件夹名称。 字符串csvFilename =“ dm.csv”; 字符串contactSheetName =“ dm_contactsheet”; 字符串路径= sketchPath()+“ / data /” + setName; println(“从“ +路径加载图像”); 数据= loadTable(csvFilename,“标题”); int numRows = data.getRowCount(); //绘制文字。 contactSheet.fill(0,0,0); contactSheet.textSize(23); int索引= 0; //此图片在当前页面上的索引。 int totalIndex = 0; //图片在整个图片集中的索引。 int sheetNumber = 0; 对于(TableRow行:data.rows()){contactSheet.beginDraw(); 字符串时间= row.getString(“ time”); 字符串ID = row.getString(“ num”); 字符串文件名= thumbnailName + id +“ .jpg”; println(“放置” +文件名+“,” +时间); Panorama = loadImage(setName +“ /” +文件名); int x =索引%numColumns; 整数y =索引/ numColumns; contactSheet.textFont(courierFont,23); contactSheet.text(“ time:” + time,x *(thumbnailWidth + 35),(y *(thumbnailHeight + 30))+ thumbnailHeight + 24); contactSheet.image(panorama,x *(thumbnailWidth + margin),y *( thumbnailHeight +边距)); 索引++; totalIndex ++; boolean atLastImage = totalIndex == numRows-1; if(index == PanoramasPerSheet || atLastImage){字符串sheetName = contactSheetName +“ _” + sheetNumber +“ .jpg”; println(“ Saving” + sheetName +“ \ n \ n”); contactSheet.save(sheetName); contactSheet.background(backgroundColor); sheetNumber ++; 索引= 0; } contactSheet.endDraw(); } println(“ DONE!”); } void draw(){} //此函数以字符串数组的形式返回目录中的所有文件。String [] listFileNames(String dir){File file = new File(dir); 如果(file.isDirectory()){字符串名称[] = file.list(); 返回名称; } else {//如果不是目录,则返回null; }} //此函数以文件对象数组的形式返回目录中的所有文件// //如果需要有关文件File [] listFiles(String dir){File file = new File(dir); 如果(file.isDirectory()){File [] files = file.listFiles(); 返回文件; } else {//如果不是目录,则返回null; }}