使用 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本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.