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

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

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

艺术家和设计师应该学习如何编程。我说了。

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

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

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

User profile image.
Jason van Gumster 主要编造东西。他写作、制作动画,偶尔也使用开源工具进行教学。他经营一家小型独立动画工作室,撰写了《Blender For Dummies》和《GIMP Bible》,并继续在 [有时] 每周播客《开源创意播客》中吐露自己的经验。冒险(和谎言)尽在 @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.