ImageMagick"颜色到alpha"(像GIMP)

Tha*_*any 8 imagemagick gimp imagemagick-convert

我正在尝试做GIMP在选择具有实际颜色的"颜色到alpha"时所做的事情.

我有一个颜色为#a0132e的图像,我想将其转换为透明度.不仅是那种确切的颜色,而且任何偏离它的颜色都必须变得非常透明.这就是GIMP中"颜色对alpha"的作用.

我已经尝试了一百万种不同的东西,但我无法理解它.我一直在为自己打扰几个小时尝试-fx参数,这绝对是奇怪的语法,所以这根本没有帮助.也许有些选项convert可以解决这个问题,但我还没有找到正确的做法,而且,我已经尝试了谷歌得到的所有东西.

理想情况下,我想创建一个我可以这样调用的脚本:

color-to-alpha.cmd original.png output.png #a0132e

或类似的.我怎样才能做到这一点?

Kur*_*fle 23

1.有关ImageMagick命令行参数的基础知识

首先:请同时阅读我的​​答案" ImageMagick命令行选项顺序(以及命令行参数的类别) ".它解释了一些关于ImageMagick命令行结构的基础知识.具体来说,它解释了以下主要区别:

  1. 图像设置
  2. 图像运算符
  3. 图像序列运算符

这些差异是理解的关键概念,以便能够剖析复杂的ImageMagick命令行.

2.关于ImageMagick '搁置'处理的基础知识

建议的命令是一个相当高级的命令.它使用括号分隔出完整命令行的两个不同部分.

带括号的命令部分允许处理主命令"旁边"的图像:它允许您在单独的图像列表上执行某些操作,然后将该单独处理的结果放在上一个列表的末尾.(您可以在单个ImageMagick命令行中使用多个,甚至使用嵌套的括号图像处理操作.)在某种程度上,它可以作为一个便笺簿,您可以处理图像子集并将结果放回主图像列表中.

任何一对括号(" (")的打开都会启动一个新的图像列表.括号内的所有连续参数仅适用于新图像列表.)各个括号对的结束(" ")部分完成所有"旁边"处理,并将结果图像列表从"旁边"(这可以由零个,一个或多个图像组成)放置到主图像列表上.

唯一的一点变化我作出@ dlemstra的原始命令:我逃脱()出现以反斜线和更换这些 \(\).这是必需的,所以像Bash这样的shell不会试图将这些字符误解为指示子shell的开始和结束.

重要的是要注意:当您使用()分隔符进行旁边处理时,您必须在它们周围留下空白 - 否则它们将无法工作!

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
Run Code Online (Sandbox Code Playgroud)

4.现在逐行删除这个怪物命令

  1. 第1行: convert
    这是要运行的ImageMagick命令.

  2. 第2行: original.png
    这是要处理的第一个输入图像.此时,这是主图像列表中的唯一图像.

  3. 第3行: \(
    打开一个新的(空)图像列表,从主图像列表"旁边"处理.

  4. 第4行: -clone 0
    " - clone"图像堆栈操作符.它要求从最后"推送"的图像序列中复制该图像.来自最后推送的图像序列的最后一个图像具有索引0.换句话说:将original.png的副本放入当前的"旁白"图像列表中.

  5. 第5行: -fill "#a0132e"
    "-fill"图像设置.它定义填充图形基元时要使用的填充颜色. "#a0132e"是一种红色.

  6. 第6行: -colorize 100
    " - colorize"是一个图像操作.它使用指定的颜色(此处:100)使用最近填充设置指定的颜色为图像着色.结果现在是与original.png大小相同的图像.该图像具有均匀的颜色"#a0132e".换句话说:新创建的图像是一个带有与original.png大小相同的红色补丁.

  7. 第7行: \)
    这将关闭旁边处理并将结果图像放在主图像列表的末尾.现在主图像列表中有2个图像:first,original.png ; 第二,在"旁白"过程中创建的相同大小的带红色,均匀着色的红色.

  8. 第8行: `(
    打开另一个新的图像列表,用于另一个"旁边"处理.

  9. 第9行: -clone 0,1
    " - clone"是(仍然是)图像堆栈操作符.这里要求用索引01复制每个图像.换句话说:将original.png的副本和统一着色的"reddish"副本放入当前的"旁白"列表中.

  10. 第10行: -compose difference
    " - compose"图像设置.它定义了特定复合操作的算法供以后使用,在我们的情况差异.

  11. 第11行: -composite
    " - composite"是一个图像序列运算符.它在两个图像和一个可选的蒙版上执行alpha合成.应用此运算符后,"旁白"图像序列中只剩下1个图像.该图像是使用"差异"算法将original.png的克隆与均匀着色的"带红色"图像合成的结果.

  12. 第12行: -separate
    " - 分离"是另一个图像序列操作符.它将图像通道分离为灰度图像.在此操作符完成后,"旁边"图像序列中将留下许多灰度图像.该数字取决于应用-channel时处于活动状态的实际设置-separate.

  13. 第13行: +channel
    " - channel"图像设置.通常看起来-channel <type>指定应该使用哪些通道.(实施例:-channel Red用于红色,或-channel GB绿色+青,或-channel Alpha,或-channel CMY-channel Cyan,Magenta,Yellow两者用于青色+品红色+黄色).特殊的+-prefix with +channel表示:将值重置为默认值.这些默认值......

  14. 第14行: -evaluate-sequence max
    " - 评估序列"图像序列运算符.它通过评估图像序列上的算术,关系或逻辑表达式来改变通道像素.在我们的例子中,它设置"最大".的"最大"方法获得最大值(亮)用于从所述序列中的每个像素值的值.作为该运算符的结果,将留下一个图像,其中每个位置的像素在比较来自序列的每个图像的各个像素之后使用最亮的值.

  15. 第15行: -auto-level
    " - 自动级"图像操作员.它可以自动调整图像的色彩等级.

  16. 第16行: \)
    这将关闭旁边处理.现在将所得到的处理图像放入主图像列表中.主图像列表目前由3个图像组成:original.png,"带红色"图像,加上前一个"旁边"处理创建的图像.

  17. 第17行: -delete 1
    " - 删除"是一个图像序列操作符.它通过索引从图像序列中删除图像.索引1表示序列中的第二个图像(请记住:索引是基于0的).在该操作符完成之后,在当前"旁边"图像序列中仅剩下前3个图像中的2个(因为三个图像中的第二个被删除).如果我的计数到目前为止是正确的,那么删除的图像应该是由第一个"旁边"过程产生的均匀颜色的"红色".完成该操作后,将在主图像列表中保留2个图像.

  18. 第18行: -alpha off
    "-alpha"图像设置.在这里,它关闭了图像的alpha通道. 请注意,这仅禁用图像的透明度通道.它不会删除或更改现有数据.它只是关闭使用该数据进行后续处理.(如果它自己更改了现有数据,则它可以作为图像操作员而不是图像设置.)

  19. 第19行: -compose over
    " - compose"是(仍然)图像设置.它将后续-composite图像操作员使用的算法设置为"over".该算法在目的地上组合源.它是默认的alpha混合撰写方法.

  20. 第20行: -compose copy_opacity
    " - compose"是(仍然)图像设置.这里它将复合算法设置为"copy_opacity".由于它直接跟随-compose over设置,因此使该设置无效!

    换句话说:您也可以-compose over从完整命令中跳过设置(第19行). 这种遗漏应该对最终结果没有影响.

  21. 第21行: -composite
    " - composite"是(仍然)图像序列运算符.在我们的例子中,这将算法"copy_opacity"应用于合成图像.这会将指定的通道不透明度从源图像复制到目标图像中的同一通道.

  22. 第22 output.png
    :此行设置输出图像的名称.

5.可视化命令的每一步 - 插入 +write filename

如果你不熟悉它,这是一个额外的提示.

你可以插入

 +write output-destination
Run Code Online (Sandbox Code Playgroud)

(几乎)在命令行的任何地方 - 甚至多次.然后,write操作员将当前处理状态的当前加载图像(或当前加载的图像序列)写出到给定的输出目的地.

此输出目标可以是文件,或者show:对IM输出有效的任何其他内容.写入输出后,原始命令的处理将继续并继续.

当然,仅+write在第一个(或任何其他)图像(序列)操作符之后插入(不在任何图像设置之后)才有意义- 否则当前图像列表将不会改变.

如果存在多个输出图像(因为当前图像列表包含多个图像),则ImageMagick将自动为相应的文件名分配索引编号.

这是一个很棒的技巧!如果您开始将它用于您自己的ImageMagick命令开发,您很快就会发现它不可或缺.它有助于调试(或优化,简化,简化......)复杂的命令设置.

6.使用适当的修改命令行 +write filename

如果您希望"直观地增强"了解图像设置,图像操作和图像序列操作的上述逐行说明,则运行此修改后的命令.查看+write命令创建的每个图像,并将它们与本答案第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
Run Code Online (Sandbox Code Playgroud)

7.显示下面的原始,中间和输出图像

好的,同时我在输入图像上运行了以前的命令.下图显示了它与原件并排显示.也许我为测试选择的original.png并不适合与'#a0132e'一起测试.但是由于@Thany没有回应@MarkSetchells评论要求示例图像,你将不得不忍受我的选择:

原始(左)和输出图像(右)

以下是修改后的命令的结果,该命令使用了+write对原始命令行的多次添加.

正如预期的那样,original.png看起来与它的克隆相同,以及其他一些克隆图像.

具有相同前缀多个文件名1---,2---...从相同的结果+write的命令,从而发现多个图像,以当前加载图像列表保存.

原始图像(左上),中间处理结果和输出图像(右下)

8.为读者练习

如果我关于第20行无效的关于第19行的陈述是正确的,请检查.从命令行中删除并测试结果是否仍然相同.-compose over


更新

我最初写的这个答案是为了详细解释@dlemstra给出的命令行.Dirk的答案基于一个ImageMagick脚本,color2alpha,由Fred Weinhaus编写.我现在才更仔细地看弗雷德的剧本:

Fred的脚本提供了一些额外的非常漂亮的选项:

  1. 它可以指定输入图像中的任何颜色,以用作创建渐变Alpha通道的基础.
  2. 它可以指定另一种颜色来替换输出中的alphacolor.
  3. 它实现了一个"增益"控制,可以影响alpha通道中白色到黑色的转换.

  • 这是有史以来最伟大的答案之一 (2认同)

dle*_*tra 5

ImageMagick没有内置的颜色转换为Alpha算法。Fred Weinhaus提出了以下解决方案,该解决方案与GIMP的alpha插件的颜色几乎相同。

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
Run Code Online (Sandbox Code Playgroud)