艺术家和设计师应该学习如何编程。我说了。
现在,我可以深入探讨艺术家思维模式和开发者/工程师思维模式并非截然不同,或者“非技术型艺术家”的形象是相对较新的现象。这些是另一篇文章的主题。就本文而言,我只想说,了解一点代码不仅能让你更好地理解你的数字工具是如何工作的,而且这些知识将帮助你更有效地创作作品。
无论你是在为付费客户进行大型协作项目,还是将数字艺术作为你自由奔放、自由自在的宣泄引擎,我们都希望最有效地利用我们的时间。就我个人而言,如果我发现自己连续三次以上做某种单调乏味的任务,我已经在考虑如何自动化它,让我的电脑为我完成这项工作。
自动化意味着拼凑一个脚本。编码。当涉及到编写与数字媒体相关的任务脚本时,你很难找到比 Python 更合适的语言了。Python 是一种非常流行的开源脚本语言,用于编写各种开源软件。
对于数字创意人员来说,学习 Python 还有其他优势。Python 的语言语法相对容易学习,而且 Python 在所有主要平台上都可用。这意味着你的脚本可以随你而行,无论你运行的是 Linux、BSD 还是那些专有操作系统。不仅如此,Python 还很好地集成到许多数字内容创作工具中,如 Blender 和 GIMP。甚至一些专有工具也集成了 Python。这意味着你可以使用 Python 在这些程序中自动化任务,甚至添加特定于你的工作方式的新功能。
“这听起来很棒,”你可能会说,“但请具体一点。我实际上可以用 Python 做什么?”
很高兴你问了。
本系列文章旨在回答这个问题,让你涉足其中,了解只需一点脚本知识就能实现什么。友情提示:如果这些文章确实激发了你对脚本的兴趣,我强烈建议你学习许多在线提供的 Python 课程之一,包括官方 Python 文档中包含的教程。
我还应该提到,我给出的例子可能会让“真正的”Python 开发者感到不适。但这没关系。最坏的情况,我们仍然有一个脚本可以完全满足我们的需求。最好的情况,我们会在本文的评论区收到改进建议。
那么,让我们从一些简单的东西开始。我们都知道,像 FFmpeg 和 ImageMagick 这样的命令行工具通常是执行一次性视频或图像操作的更快方法。假设你只想编码一个视频或使 PNG 图像去饱和并将其转换为 JPEG。与启动一个带有完整图形界面的程序、加载你的源媒体,然后执行那一个小操作相比,发出一个命令要快得多。
然而,问题是,像 FFmpeg 和 ImageMagick 这样强大的命令行工具具有很多选项和灵活性。它们可以做很多事情,而且所有这些都由一系列令人眼花缭乱的标志和选项控制,你需要正确输入这些标志和选项。很难记住你需要完成一两个特定任务的确切魔法咒语。
举例来说,假设你有一个目录,其中包含由你最喜欢的动画软件生成的 PNG 图像。其中有数百甚至数千个单独的图像。现在假设你意识到没有必要将所有这些图像保存为 16 位 RGBA PNG。如果将这些图像全部转换为 1 位黑白 PNG 图像,你可以节省大量磁盘空间并获得更快的加载时间。当然,你可以重新渲染,但图像已经存在了。使用 FFmpeg,你可以更快地处理这些图像并进行转换... 如果你能记住执行此操作的确切命令。
幸运的是,你之前已经做过几次了,所以你花了一点时间,拼凑了一个名为 make_1bit.py
的小 Python 脚本。记住 make_1bit.py
比记住 ffmpeg -i something -flipflop -blah blah -please -o somethingelse
或其他东西要容易得多。以下是你的脚本内容(换行以适应此列宽;有关正确格式化脚本的方法,请参见下文)
import subprocess
subprocess.call(['ffmpeg', '-f', 'image2', '-i',
'%04d.png', '-pix_fmt', 'monob', '-threads', '0',
'%04d.png'])
让我们花一点时间快速浏览一下脚本,描述它的作用。第一行 import subprocess
,导入一个名为 subprocess
的 Python 模块。将模块视为其他人已经编写的代码块。你只需要让你的脚本意识到这些代码。这可以通过 import
语句完成。在本例中,你导入了 subprocess 模块,这是一个专门用于启动命令的 Python 模块,就像你在命令行中键入它们一样。
在下一个代码块 (subprocess.call(['ffmpeg',...])
) 中,你实际上使用了该模块中的代码为你运行 FFmpeg。整个 FFmpeg 命令被分解成一个字符串列表。在 Python 中,列表只是数据的集合。它用方括号 ([]
) 表示,每个数据位用逗号分隔。在本例中,每个数据位都是一个字符串,或用单引号括起来的一段文本。列表中的每个字符串都是你想要运行的 FFmpeg 命令中的参数(标志),顺序正确。
在这个特定的例子中,我们假设脚本与你的图像在同一个目录中,并且图像具有编号的文件名,如 0001.png、0002.png、0003.png 等。
为了组织起见,你可能希望将每对参数放在它们自己的行上。这样可以更容易地了解发生了什么。(注意:Python 对代码中的“空格”(空格和制表符)非常挑剔。因此,请确保你使用空格或制表符不要混合使用!,并在缩进时使用相同的数量。)如果你这样做,你的脚本可能看起来像这样
import subprocess
subprocess.call(['ffmpeg',
'-f', 'image2',
'-i', '%04d.png',
'-pix_fmt', 'monob',
'-threads', '0',
'%04d.png'])
现在你所要做的就是从该目录中运行 python make_1bit.py
,然后,砰,文件转换完成!无需记住 FFmpeg 的所有各种标志。脚本为你记住了这些标志。当然,如果你想直接运行 FFmpeg(或此命令的某些变体),很容易打开你的脚本文件,并将这些标志作为参考清晰地组织起来。你甚至可以向脚本添加注释,以便你可以更轻松地了解每个标志的作用
import subprocess
subprocess.call(['ffmpeg',
'-f', 'image2', # Read input as images
'-i', '%04d.png', # Input files (sequential PNGs)
'-pix_fmt', 'monob', # Output colorspace is 1-bit
'-threads', '0', # Use all available CPU cores
'%04d.png']) # Output files (overwrite input)
这就是我们的起点。我们一次编写一个小脚本。重点是通过简化和自动化重复或繁琐的任务来节省我们的时间,并使我们专注于完成工作。
本系列文章还将继续... 但与此同时,如果你碰巧使用 Python 脚本来简化任务(无论是用于创意工作还是其他工作),也许你可以使用评论区来解释你做什么。
4 条评论