- Max/MSP/Jitter 教程 01 - 什么是矩阵?
- Max/MSP/Jitter 教程 02 - Jitter 对象的属性
- Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
- Max/MSP/Jitter 教程 04 - 创建矩阵
- Max/MSP/Jitter 教程 05 - 矩阵的数学运算
- Max/MSP/Jitter 教程 06 - 控制视频播放
00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 5: ARGB Color
Jitter 中的颜色
本节将讨论如何在 Jitter 中处理颜色,主要讲解用数字表示颜色,而不涉及把数字可视化为颜色。用数字表示颜色有许多方法,而关于色彩理论的全面讨论 - 光和物质如何产生色彩感觉 - 远远超出了本教程的范围。如果想了解颜色相关的理论和/或颜色数值表示的更多信息,可以查看参考书目。
本节重点说明 Jitter 表示颜色的方法,以及如何在矩阵中实现。
颜色组成:RGB
混合红色,绿色和蓝色可以产生任意颜色 - 每种颜色都有一定的亮度(intensity)。这是「加法合成(additive synthesis)」 - 添加一定量的三原色光来生成颜色(与此相反的是减法合成:混合有色颜料,如油漆,吸收某些颜色的光并反射其余部分)。这样就可以用红色,绿色和蓝色相对应的频率强度来描述任意颜色。
在 Jitter 中一般用红色,绿色和蓝色的精确亮度组合来描述颜色。对于图像的每个像素 - 无论是视频,图片还是其他 2D 矩阵 - 至少需要三个值表示三原色。屏幕上的彩色图像一般使用至少 3 个平面的 2D 矩阵。
Alpha 通道
第 4 个平面一般是 alpha 通道 - 它存储像素的透明度信息。Jitter 矩阵中一般都会包含颜色透明度的 alpha 通道。多数情况下,alpha 通道存储在平面 0(矩阵平面从 0 开始编号),RGB 值存储在 1,2 和 3 平面中。
颜色数据:char,long 或 float
在计算机中用 8 位信息来表示每个基本颜色值。8 位能够表达 256(2 的 8 次幂)个不同值。如果分别用 8 位表示红色、绿色、蓝色,总共可以表示 16,777,216(2 的 24 次方)种不同颜色,足以覆盖人眼能够区分的所有颜色渐变。
因为 8 位分辨率已经可以表示所有基本颜色值,所以颜色信息矩阵 4 个平面中的值用 8 位 char 类型就足够了。当然 Jitter 也允许用 long,float32 或 float64 类型,只不过这会浪费内存。全帧视频图像要处理大量的像素(640x480 图像有 307,200 像素),为了节省内存和加快处理速度,最好使用 char 数据类型。
8 位 char 数据可以表示 0~255 之间的数字,或者 0~1 之间的灰度。包含 char 数据的 Jitter 对象,通常以 0~1 范围内浮点数的形式从其他 Max 对象接收数值。然后在内部计算时将浮点数转换为对应的 char 值(有一些例外,例如 jit.op
可以接收 0~1 的浮点数或右入口的 0~255 的整数)。关于在 Jitter 矩阵中使用 char 数据类型的更多内容,请参阅教程什么是矩阵?
分离矩阵的平面
在示例 patch 的顶部有两个视频。一个是街机游戏,另一个是视频校准的标准颜色条。打开 metro
对象(用来反复触发矩阵对象)可以查看。
观看视频或静止图像
单击 metro 30
对象上方标有 “show movie” 的按钮查看视频
示例 patch 用 jit.unpack
对象将颜色信息矩阵分解为 4 个平面,可以单独查看和修改每个平面。与 Max 对象 unpack
将列表拆开成单个数字类似,jit.unpack
将多平面矩阵分解为单平面矩阵。可以输入参数来指定矩阵中有多少个平面,默认是 4 个平面,这是颜色数据的标准。想看到红色,绿色和蓝色屏幕的内容,就将平面 1,2 和 3 发送到 jit.pwindow
。因为这里不关心 alpha,所以不显示平面 0。
将多平面矩阵拆为单平面矩阵
可以用三个单色图像查看每个颜色平面的内容。较亮的像素表示该颜色值较大。将每个矩阵发送到 jit.op
可以单独控制每种颜色的强度,并改变颜色平衡。然后将单个(改变后的)矩阵发送到 jit.pack
,重新组合为 4 平面矩阵在 jit.pwindow
中显示。
尝试将绿色和蓝色的强度降低到 0.12,生成更偏红色的图像:
降低某些颜色的亮度来改变颜色平衡
颜色交换
为了演示另一种技巧,将每个颜色平面发送到 gate
对象,这样每个矩阵都可以 route
到 jit.pack
的不同入口(颜色平面)。这样就重新定义了每个平面,并且从 patch 左侧的 coll
对象中选择选项来尝试所有可能的颜色组合。
拖动标记为 “Rotate RGB planes” 的数字框,尝试重新分配三个颜色平面。(请注意,平面 0 直接从 jit.unpack
发送到 jit.pack
; 它是触发矩阵输出到 jit.pwindow
的 jit.pack
的左入口收到的 jit_matrix
消息)如果选择 coll 中的选项 3,会得到如下结果:
重新分配各个颜色平面; 红色和绿色平面相互交换
上面的示例显示原始的绿色和蓝色平面减少为原来的 0.12,并在发送到 jit.pack
之前,用 gate
调换红色和绿色平面,得到更偏绿色的图像。coll
对象包含 RGB 平面所有可能的排列组合。
双击 coll
对象可以查看其内容:
RGB 平面分配的排列组合
来自 coll
列表中的元素被 unpack
并发送给 3 个 gate
对象。发送到 coll
的数字也会发送给 umenu(标签模式)用单词显示颜色状态 - 现在显示为 “Green-Red-Blue”。
颜色自动变化
让我们再来做一个颜色修改练习:制作不断更改颜色的缩放和旋转的自动化流程。
点击标记为 “Automate color changes” 的开关。三个颜色平面的缩放因子都在不断变化。双击 patch colorgames
对象查看子 patch 的内容。
[colorgames]子 patch
子 patch 用 line
对象为每个颜色缩放因子发送 0.5~1 的值。红色系数每 3 秒变化一次,绿色每 4 秒变化一次,蓝色每 5 秒变化一次(这三个 line 对象每 60 秒同步一次)。每隔 60 秒,metro
计数器会选择一个新的颜色组合。
你可以在不同的源图像上尝试所有颜色组合。回到主 patch,点击标记为 “Show movie” 的开关停止 metro
。(也可以用这个开关来启动和停止 jit.movie
播放视频。如果不需要观看,就没必要持续播放)现在点击标有 “Show colorbars ” 的开关来显示颜色栏。试着更改此图像上的 scale 和 rotation 系数。
小结
当 jit.window
或 jit.pwindow
接收单平面 2D 矩阵时,会显示为单色(灰度)图像。当接收到 4 平面 2D 矩阵时,会将平面解析为 alpha,red,green 和 blue 值并显示相应颜色。Jitter 最常用 ARGB 4 平面矩阵来表示颜色。
Jitter 颜色数据以 char 数据类型存储,因为所有基本颜色只需要 8 位精度就可以完全覆盖。大多数与 QuickTime 相关的对象(例如 jit.movie
)和许多专门用于操作颜色的对象(例如 jit.brcosa
和 jit.colorspace
)都使用 4 平面 char 数据的 2D 矩阵。(许多对象会自适应其他数据类型。如有疑问请查看相应文档)。char 数据的范围是 0~255 的证书,或者 0~1 的浮点数。大多数情况下,包含 char 数据的对象从其他 Max 对象接收 0~1 的浮点数值。
jit.unpack
可以拆分多平面矩阵为单平面矩阵。jit.pack
打包单平面矩阵成一个多平面矩阵。单独处理每个平面可以控制图像的色彩平衡,甚至可以重新定义各个平面。
友情提示:独自折腾 Max 易患上癔症……不妨入群互助
👇👇👇