自动化图书制作

我的许多工作都很难以书的形式进行,因为它的视频,动画交互代码或大数据集中的模式和对象识别。 因此,我发现自己拥有成千上万张图像,但是没有一个图像能够完整地讲述有关该作品的故事。 因此,我决定通过使用自定义脚本来自动安排书籍的版式,来创建此作品的目录,以按顺序显示所有图像。

现有的大多数制书工具都相对较差。 InDesign允许您生成图像目录,但是策展和控制的数量非常有限,而且很不幸,它可能会出现故障。 我将Processing与一些自定义Java脚本一起使用来创建此自定义目录:


步骤1:从电影创建图像

首先,我需要以有趣的帧频从电影中获得一系列图像。 我不希望这些框架出现得太频繁,因为这会使我的目录太长而无聊。 我将每部电影导入After Effects,并将帧频更改为非常低的水平。 通常,默认值为每秒30帧。 对于6分钟的视频来说,这就是很多帧(30帧X 360秒= 10,800)! 我试图将我的大多数电影保持在200-1500张最终图像之间。 我的最后一页每页大约有50张图像。 更改视频的帧频后,我将JPEG序列导出到文件夹。

视频->导出的帧->页面上的图像序列

原始视频:

步骤2:批处理映像重命名

我要做的下一件事是使用Bridge批量重命名图像。

步骤3:创建名称索引

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

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;  }}