我正在尝试使用实际颜色选择“颜色到alpha”时做的。
我有一张颜色为 #a0132e 的图像,我希望将其转换为透明度。不仅是那种精确的颜色,任何偏离它的颜色都必须变得半透明。这就是 GIMP 中“颜色到 alpha”的作用。
我已经尝试了一百万种不同的东西,但我无法理解它。尝试 -fx
参数几个小时以来,我一直让自己沮丧,这绝对是奇怪的语法,所以根本没有帮助。也许 convert
的一些选项可以解决问题,但我还没有找到正确的方法,实际上,我已经尝试了谷歌为我提供的所有方法。
理想情况下,我想创建一个可以这样调用的脚本:color-to-alpha.cmd original.png output.png #a0132e
或者类似的。我怎样才能做到这一点?
最佳答案
一、ImageMagick命令行参数基础
首先:请阅读我的回答 "ImageMagick Command-Line Option Order (and Categories of Command-Line Parameters) " 。它解释了一些关于 ImageMagick 命令行结构的基础知识。具体来说,它解释了以下之间的主要区别:
为了能够剖析复杂的 ImageMagick 命令行,这些差异是需要理解的关键概念。
2. ImageMagick 'aside' 处理的基础知识
建议的命令是一个相当高级的命令。
它使用括号来分隔完整命令行的两个不同部分。
带括号的命令部分允许在主命令之外处理图像:
它允许您在单独的图像列表上做一些工作,然后将单独处理的结果放在上一个列表的末尾。 (您可以在单个 ImageMagick 命令行中使用多个,甚至使用嵌套的括号图像处理操作。)
在某种程度上,它充当了一个便笺簿,您可以在其中处理图像子集并将结果放回主图像列表中。
一对括号(“
(
”)的任何开头都会启动一个新的图像列表。括号内的所有连续参数仅适用于新图像列表。
相应括号对的结束部分 ("
)
") 完成所有“aside”处理并将结果图像列表从“aside”(这可能包含零个图像)(这可能包含零个主图像列表)放置到该图像列表上。唯一的一点变化我作出@ dlemstra的原始命令:我逃离
(
和 )
出现用一个反斜杠和 \(
和 \)
替换这些。这是必需的,因此像 Bash 这样的 shell 不会试图将这些字符误解为指示子 shell 的开始和结束。重要的是要注意:当您使用
(
和 )
分隔符预留处理在他们身边,你 MUST 假空白 - 否则他们将无法正常工作!3.重新格式化原命令
首先,我将对@dlemstra 最初提出的命令进行一些重新格式化。总的来说,这并没有改变它的含义。它只将每个设置和每个操作放在自己的一行上。
(这适用于Mac OSX和Linux - 适用于Windows只是
\
全部更换 ^
续行标志。)convert \
original.png \
\( \
-clone 0 \
-fill "#a0132e" \
-colorize 100 \
\) \
\( \
-clone 0,1 \
-compose difference \
-composite \
-separate \
+channel \
-evaluate-sequence max \
-auto-level \
\) \
-delete 1 \
-alpha off \
-compose over \
-compose copy_opacity \
-composite \
output.png
4. 现在逐行剖析这个怪物命令
convert
这是要运行的 ImageMagick 命令。 original.png
这是要处理的第一个输入图像。此时此刻,这是主图像列表中唯一的图像。
\(
打开一个新的(空的)图像列表,从主图像列表“旁边”处理。 -clone 0
“-clone”是一个图像堆栈操作符。它要求从最后一个“推送”图像序列中制作该图像的克隆。
最后推送的图像序列中的最后一个图像的索引为 0。
换句话说:将 original.png 的副本放入当前的“aside”图像列表中。
-fill "#a0132e"
“-fill”是图像设置。它定义了填充图形基元时要使用的填充颜色。
“#a0132e”是一种红色。
-colorize 100
“-colorize”是一种图像操作。它使用指定的数量(此处为 100)为图像着色,使用最近的 -fill 设置指定的颜色。
现在的结果是与 original.png 大小相同的图像。
此图像具有统一颜色“#a0132e”。
换句话说:新创建的图像是一个与 original.png 大小相同的红色补丁。
\)
这将关闭备用处理并将生成的图像放在主图像列表的末尾。现在主图片列表中有2张图片:第一个,original.png;第二,在“aside”过程中创建的相同大小的红色,均匀颜色的一个。
打开另一个新图像列表进行另一次“旁白”处理。
-clone 0,1
“-clone”是(仍然是:) 图像堆栈操作符。这里它要求对每个索引为 0 和 1 的图像进行克隆。
换句话说:将 original.png 的副本和统一颜色的“reddish”的副本放入当前的“aside”列表中。
-compose difference
“-compose”是图像设置。它定义了稍后要使用的特定复合算子算法,在我们的例子中有所不同。
-composite
“-composite”是一个图像序列运算符。它对两个图像和一个可选的蒙版执行 alpha 合成。
应用此运算符后,“aside”图像序列中将只剩下 1 个图像。
此图像是使用“差异”算法将 original.png 的克隆与颜色均匀的“红色”图像合成的结果。
-separate
“-separate”是另一个图像序列运算符。它将图像 channel 分离为灰度图像。
这个操作完成后,在“aside”图像序列中会留下一些灰度图像。
该数字取决于在应用
-channel
时处于事件状态的实际 -separate
设置。 +channel
“-channel”是图像设置。通常它显示为
-channel <type>
来指定应该使用哪些 channel 。(例如:
-channel Red
代表红色,或 -channel GB
代表绿色+蓝色,或 -channel Alpha
或 -channel CMY
或 01218122231343141 或 01213131313 青色代理)。带有
-channel Cyan,Magenta,Yellow
的特殊 +
前缀表示:将值重置为其默认值。这些默认值...
+channel
“-evaluate-sequence”是一个图像序列操作符。它通过对一系列图像评估算术、关系或逻辑表达式来改变 channel 像素。
在我们的例子中,它设置了“max”。
“max”方法从序列中获取每个像素的最大(较亮)值。
作为这个算子的结果,将留下一个图像,其中每个位置的像素在比较序列中每个图像的相应像素后使用最亮的值。
-evaluate-sequence max
“-auto-level”是一个图像操作符。它会自动调整图像的颜色级别。
-auto-level
这关闭了旁白处理。旁边处理的结果图像现在被放置到主图像列表中。
主图像列表当前包含 3 个图像:original.png,“红色”图像,加上之前“aside”处理创建的图像。
\)
“-delete”是一个图像序列操作符。它从图像序列中按索引删除图像。
索引
-delete 1
表示序列中的第二张图像(记住:索引是从 0 开始的)。此操作完成后,当前“aside”图像序列中将只剩下前 3 张图像中的 2 张(因为三张图像中的第二张已被删除)。
如果到目前为止我的计数是正确的,则删除的图像应该是第一个“aside”过程产生的均匀颜色的“红色”图像。
完成该操作后,主图像列表中将保留 2 个图像。
1
“-alpha”是图像设置。在这里它关闭图像的 alpha channel 。
注意 ,这只会禁用图像的透明 channel 。
它不会删除或更改现有数据。
它只是关闭该数据用于后续处理。
(如果它自己改变了现有数据,它就有资格作为图像操作符而不是图像设置。)
-alpha off
“-compose”是(仍然是:)图像设置。它将随后的
-compose over
图像运算符使用的算法设置为“结束”。该算法在目标上合成源。
它是默认的 alpha 混合组合方法。
-composite
“-compose”是(仍然是:)图像设置。在这里它将复合算法设置为“copy_opacity”。
由于它直接遵循
-compose copy_opacity
设置,因此使此设置无效!换句话说:您也可以从完整命令中跳过
-compose over
设置 (第 19 行)。 这种遗漏应该不会对最终结果产生影响。
-compose over
“-composite”是(仍然:)图像序列运算符。在我们的例子中,这会将算法“copy_opacity”应用于合成图像。
这会将指定的 channel opacity 从源图像复制到目标图像中的相同 channel 。
-composite
此行设置输出图像的名称。 5.可视化每一步命令——插入
output.png
如果您不熟悉它,这里有一个额外的提示。
你可以插入
+write output-destination
(几乎)命令行上的任何地方——甚至多次。
+write filename
运算符然后将当前加载的图像(或当前加载的图像序列)以其当前处理状态写出到给定的输出目的地。这个输出目的地可以是一个文件,或
write
或任何其他对 IM 输出有效的东西。写入输出后,原始命令的处理将恢复并继续。当然,只有在第一个(或任何其他)图像(序列)运算符之后(而不是在任何图像设置之后)插入
show:
才有意义——否则当前图像列表将不会改变。如果有多个输出图像(因为当前图像列表包含多个图像),那么 ImageMagick 将自动为相应的文件名分配索引号。
这是一个很棒的技巧!如果您开始将它用于自己的 ImageMagick 命令开发,您很快就会发现它是不可或缺的。它对调试(或优化、精简、简化...)复杂的命令设置有很大帮助。
6. 用适当的
+write
修改命令行如果您想对上述图像设置、图像操作和图像序列操作的逐行解释进行“视觉增强”理解,请运行此修改后的命令。查看
+write filename
命令创建的每个图像,并将它们与本答案第 4 部分中的相应解释进行比较:convert \
original.png \
\( \
-clone 0 \
-fill "#a0132e" \
-colorize 100 \
\) \
+write 0---after-aside1.png \
\( \
-clone 0,1 \
+write 1---aside2-cloned.png \
-compose difference \
-composite \
+write 2---aside2-composite.png \
-separate \
+write 3---aside2-separate.png \
+channel \
-evaluate-sequence max \
+write 4---aside2-evaluate.png \
-auto-level \
+write 5---aside2-autolevel.png \
\) \
+write 6---after-aside2.png \
-delete 1 \
+write 7---main-after-delete.png \
-alpha off \
-compose over \
-compose copy_opacity \
-composite \
+write 8---main-composite.png \
output.png
7. 原始图像、中间图像和输出图像如下所示
好的,同时我已经在输入图像上运行了前面的命令。下图显示它与原件并排显示。也许我为测试选择的 original.png 并不适合与颜色“#a0132e”一起测试。但由于@Thany 没有回应@MarkSetchells 要求提供示例图像的评论,您将不得不接受我的选择:
以下是修改后的命令的结果,该命令在原始命令行中添加了多个
+write
。正如所料, original.png 看起来与其克隆相同,其他一些克隆图像也是如此。
具有相同前缀
+write
、 1---
、...的多个文件名来自相同的 2---
命令,该命令在当前加载的图像列表中找到了要保存的多个图像。8. 读者练习
检查我关于上面的 Line 19 被 Line 20 无效的声明是否正确。从命令行中删除
+write
并测试结果是否仍然相同。更新
我最初写的这个答案是为了详细解释@dlemstra 给出的命令行。 Dirk 的回答基于 ImageMagick 脚本 color2alpha,该脚本由 Fred Weinhaus 编写。我现在才更仔细地看了弗雷德的剧本:
Fred 的脚本提供了一些额外的非常漂亮的选项:
关于ImageMagick "color to alpha"(如 GIMP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408022/