-colors 打的是「名字加一组十六进制分量」。 它的用处不是「看有哪些颜色」,是「确认这个名字存不存在」。
3.11.9、3.11.10 讲音频的两个属性,这一节转到视频侧的颜色。 颜色名在滤镜链里到处都是,写错一个就是整条命令失败。
一、每行读作「名字 = 十六进制」
清单的每一行形如 red = 0xFF0000,右边那六个十六进制位就是 RGB:
名字 R G B 常见用法
black 0 0 0 清单的第一行 white 255 255 255 等于 0xFFFFFF red 255 0 0 做标记最显眼 green 0 128 0 不是纯绿,偏暗 blue 0 0 255 纯蓝 yellow 255 255 0 字幕描边常用
green 这一行值得单独看一眼:标准里它是 0x008000(深绿),
而 0x00FF00 那个名字叫 lime。想写「纯绿」,写 green 会明显偏暗。
这类反直觉的名字不止一个:gray 是 128 那档中灰,不是 50% 的 127。
所以颜色这种参数,别凭感觉写,查一下十六进制最省事。
二、同一种颜色三种写法
名字只是三种写法里的一种,另外两种更通用:
写法 例子 什么时候用
名字 color=red 手写调试,一眼看懂 0xRRGGBB color=0xFF0000 脚本生成,不用记名字 0xRRGGBBAA color=0xFF000080 要半透明时
第三行末尾那两位是 alpha:80 约等于一半,00 全透明,FF 不透明。
不写那两位就是完全不透明,不会因为「少了两位」而报错。
脚本里更推荐用十六进制:不受大小写、拼写、别名的影响。 名字适合给人看的命令,十六进制适合机器生成的命令。
三、沙箱能验到哪一层
这一节的能力边界要说清楚,不能假装测过:
想验什么 靠什么 沙箱里能验吗
这份构建有哪些名字 ffmpeg -colors 不能,要真 exe 某个名字是什么 RGB 查同名的标准色表 能 某个名字认不认 真跑一条 color= 不能,要真 exe
第二行能验,是因为 ffmpeg 那张色表本就照 X11/CSS 的名字抄的。
aliceblue 这种冷门名字都能对上,说明两边同源。
但「同源」不等于「逐个都一致」——个别名字在两边可能有细微差别。
所以真要用冷门颜色,还是以 -colors 打出来的十六进制为准。
四、动手 Demo:名字、十六进制、透明度三套写法
取了七个最有代表性的名字,把它们对应的 RGB 读出来摆成表。 重点看 green 那一行——它跟大多数人的直觉不一样。 沙箱里没有 ffmpeg,这一步用的是同名标准色表,同源关系在正文里说明。
import av
from PIL import ImageColor
COLORS = [u"black", u"white", u"red", u"green",
u"blue", u"yellow", u"aliceblue"]
for name in COLORS:
r, g, b = ImageColor.getrgb(name)
print(u"%-10s 0x%02X%02X%02X %3d %3d %3d" % (name, r, g, b, r, g, b))
# 透明度:末尾两位是 alpha
for a in (0xFF, 0x80, 0x00):
print(u"0xFF0000%02X 不透明度约 %d%%" % (a, round(a / 255.0 * 100)))
实跑输出:
--------------------------------------------------------------------
3.11.11 -colors——名字、十六进制、透明度三套写法
--------------------------------------------------------------------
**① `-colors` 打的是「名字 + 一组十六进制分量」**
**每行形如 `red = 0xFF0000`,左边是能在 `color=` 里直接写的名字,右边是等价的十六进制。**
**所以这张表真正的作用不是「看有哪些颜色」,而是「确认这个名字存不存在」。**
**② 几个最常见的名字,连同它的 RGB**
名字 R G B 常见用法
---------------------------------------------------------------
black 0 0 0 -colors 表的第一行
white 255 255 255 最常用,等于 0xFFFFFF
red 255 0 0 纯红,做标记最显眼
green 0 128 0 注意不是 0x00FF00
blue 0 0 255 纯蓝
yellow 255 255 0 字幕描边常用
aliceblue 240 248 255 冷门名,证明表很大
**`green` 这一行值得单独看一眼:标准里 `green` 是 0x008000(深绿),**
**而 0x00FF00 那个名字叫 `lime`。想在画面里写「纯绿」,写 `green` 会偏暗。**
**③ 同一种颜色有三种写法,效果完全一样**
写法 例子 什么时候用
------------------------------------------------------------
名字 color=red 手写调试,一眼看懂
0xRRGGBB color=0xFF0000 脚本生成,不用记名字
0xRRGGBBAA color=0xFF000080 要半透明时
**第三行末尾那两位是 alpha:`80` 约等于一半,`00` 全透明,`FF` 不透明。**
**不写那两位就是完全不透明,不会因为「少了两位」而报错。**
**④ 沙箱能验到哪一层**
想验什么 靠什么 沙箱里能验吗
------------------------------------------------------------------
这份构建有哪些颜色名 ffmpeg -colors 不能,要真 exe
某个名字是什么 RGB 查同名的标准色表 能
某个名字 ffmpeg 认不认 真跑一条 color= 不能,要真 exe
**第二行能验,是因为 ffmpeg 那张色表本来就是照 X11/CSS 的名字抄的,**
**`aliceblue` 这种冷门名字都能对上,说明两边同源。**
**但「同源」不等于「逐个都一致」——个别名字在两边可能有细微差别,**
**所以真要用某个冷门颜色,还是以 `-colors` 打出来的十六进制为准。**
green 打出来是 0x008000,不是 0xFF0000 那种纯色——它本身就是深绿。
想要 0x00FF00 得写 lime,这个名字很多人不知道。
下面那三行演示 alpha:FF 是 255 即完全不透明,80 约一半,00 全透明。
所以 0xRRGGBBAA 那八位的最后两位,作用就是一个「浓淡旋钮」。
这一步验的是「名字对应的 RGB」,不是「ffmpeg 认不认这个名字」。 两件事的边界要分清:前者是标准色表的事,后者要真 exe 才答得了。
30 秒实验
- 列颜色:
ffmpeg -colors,每行左边是名字、右边是十六进制。 - 用名字:
ffmpeg -f lavfi -i color=red:s=320x240 -frames:v 1 出.png。 - 用半透明:
ffmpeg -f lavfi -i color=0xFF000080:s=320x240 -frames:v 1 出.png。
常见误区
- 以为
green是纯绿。它是 0x008000 深绿,纯绿那个名字叫lime。 - 以为不写 alpha 会默认透明。不写那两位就是完全不透明。
- 以为颜色名在所有构建上都一样。清单随构建变,冷门名字要用
-colors确认。
自测三问(点开对答案)
1. `green` 对应的十六进制是多少?纯绿又该写什么名字? —— `green` 是 0x008000,属于深绿;纯绿 0x00FF00 的名字是 `lime`。 2. `0xRRGGBBAA` 里最后两位管什么? —— 管透明度(alpha):FF 完全不透明、80 约一半、00 全透明。 3. 为什么脚本里更推荐写十六进制而不是颜色名? —— 十六进制不受拼写、大小写、别名影响,机器生成的命令用它最稳。- ☐ (本节完,下一节 3.11.12 -pix_fmts)