使用 Python 为数字艺术家自动化重复性任务

第 1 部分:艺术家的 Python 技巧系列
9 位读者喜欢这篇文章。
Project Goodeberry surprised sheep character

Cosmos Laundromat 的原始渲染图。Jason van Gumster 修改。CC-BY 4.0

艺术家和设计师应该知道如何编码。我说了。

现在,我可以深入探讨艺术家思维模式和开发人员/工程师思维模式并非完全不同,或者“非技术艺术家”的形象是相对较新的现象。这些是另一篇文章的主题。就本文而言,我只想说,了解一点代码不仅能让你更好地理解你的数字工具是如何工作的,而且这些知识将帮助你更有效地创作作品。

无论你是在为付费客户进行大型协作项目,还是将数字艺术作为你自由奔放、自由自在的宣泄引擎,都没关系。我们都希望最有效地利用我们的时间。就我个人而言,如果我发现我连续三次以上做某种单调的任务,我已经开始考虑如何自动化它,让我的电脑为我工作。

自动化意味着拼凑一个脚本。编码。当涉及到编写与数字媒体相关的任务脚本时,你很难找到比 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 脚本来简化任务(无论是用于创意工作还是其他工作),也许你可以使用评论区来解释你自己做了什么。

User profile image.
Jason van Gumster 主要凭空捏造东西。他写作、制作动画,偶尔也教书,所有这些都使用开源工具。他经营着一家小型独立动画工作室,撰写了《Blender For Dummies》和《GIMP Bible》,并继续在 [有时] 每周播客《Open Source Creative Podcast》中滔滔不绝地讲述他的经历。@monsterjavaguns 的冒险经历(和谎言)。

4 条评论

100% 同意。当我开始接触 Linux 时,我甚至不想学习编码,我只是想要一个更高效的操作系统环境。然而,我对 BASH 和 Python 了解得越多,我的工作流程就越高效。现在,我感到惊讶的是,艺术学院里竟然没有人提到一点技术知识的潜力。活到老学到老,我想是这样的。

好吧,如果我显得有点唐突,请原谅,但说真的:这是简单、快速和容易的 bash 脚本的最佳案例,而你却决定使用 Python?

尽管我有所疑虑,但我承认,有时在极少数情况下,Python 可能是完成这项工作的正确工具,但绝对不是这种情况。

附言:如果本系列文章的后续文章显示实际需要 Python,我将完全准备好吃掉我的话并道歉,所以请不要误解我的意思。

我理解你的观点,我在写这篇文章时肯定考虑过这一点。然而,这篇文章旨在作为进入脚本世界的入门级文章。尽管我很喜欢 bash,但它 [还] 没有 Python 那样跨平台……也没有 Python 那样在创意工具中被普遍使用。

因此,*如果* 你碰巧在正确的平台上,并且你只对解决这个非常具体的问题感兴趣,那么是的……bash 是完成这项工作的更好工具。但是,如果你不在具有适当 bash shell 的系统上,或者你的兴趣是开始使用 Python 作为在日常用作艺术家的程序中更多地使用它的手段,那么希望这[系列]文章能够为你提供你正在寻找的开始。

回复 作者:Tim Van den La… (未验证)

Jason 使用 Python 调用 FFmpeg 展示了 Python 的灵活性。我不明白在 BASH 中提供该代码除了证明 ffmpeg 存在并且可以从 shell 中使用(这是它的默认设置)之外,还能证明什么。

为创意应用程序学习 Python 比为同一目的学习 BASH 要好得多。我两者都用,但实际上 Python 更有意义,因为几乎任何允许脚本的创意应用程序(无论是开源的还是其他的)都提供(至少)Python 钩子。哎,即使 MEL 也几乎让位于 Python——这意味着 Python 以某种方式克服了一家闭源公司令人恐惧的 NIH 综合症;这绝非易事。

我也觉得 Python 的天花板较低;你可以从编写脚本开始,然后最终编写一个视频编辑器。使用 BASH,你可能会编写一些很棒的实用程序,但你可能不会使用它来编写应用程序或编写独立的创意应用程序。

我不认为推广 Python 意味着诽谤 BASH。它们都是开源的,工作流程中都有它们的位置,它们都是完全跨平台的(尽管 Windows 上的 BASH 大概会因缺乏 POSIX 兼容性而受苦),而且它们都是很棒的语言。

回复 作者:Jason van Gumster

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.