imagemagick:通过与黑色

时间:2016-07-05 09:45:52

标签: imagemagick transparency

我有一个图像,其中包含某个色彩图的填充轮廓,其中白色是最低级别。我不想在白色完全透明的地图上添加alpha透明度,颜色与白色的“相似”越少,透明度就越低(达到最大“模糊”)。我怎么能这样做?

修改 澄清:我想分配例如:

  • 所有颜色均为1%模糊 - 类似于白色100%透明度
  • 所有颜色为2-3%模糊 - 类似于白色99%透明度
  • 所有颜色为3-4%模糊 - 类似于白色98%透明度
  • 等等,最多可以说20%模糊 - 类似于白色

实施例: enter image description here

2 个答案:

答案 0 :(得分:1)

更新了答案

我想我现在能够更好地处理你想要的东西。我们如何计算图像的亮度,将其标准化,将其拆分为多个离散值(通过分箱),然后将其用作透明度......如下所示:

convert image.png                                          \
   \(                                                      \
      +clone -colorspace HSL -separate -delete 0,1         \
      -negate -normalize -posterize 5 -black-threshold 60% \
   \) -compose copyopacity -composite result.png

enter image description here

让我解释一下怪物命令。它说... 加载image.png,然后“在旁边”进行一些处理 - 这是括号(...)中的所有内容。完成“on-the-side”处理后,使用您生成的任何内容作为原始图像-compose copy opacity -composite的不透明度/ Alpha通道并保存结果。

现在,让我们看看()内的“在场”处理。那说...... 复制原始图像(+clone)并将其转换为色调,饱和度和亮度通道而不是RGB(-colorspace HSL)。然后分开3个通道(-separate)并丢弃通道0和1 - 所以我丢弃了色调(颜色)和饱和度(鲜艳度),我只剩下原始图像的亮度或亮度 - 是我们真正想要的。现在我将亮度范围(-normalize)标准化为0-255的整个范围,并使用-posterize 5将其转换为5个步骤。所以步骤将是0-50,50-100,100-150,150-200和200-255。然后,我将所有步骤都设置为小于60%,这样图像中的所有阴影和中间调都是完全不透明的,只有高光部分具有阶梯不透明度。然后当我最终退出如上所述的括号时,将其用作alpha通道。

如果您想实际看到所有“正面”处理生成的不透明度频道本身,只需在-write opacity.png之后和结束-black-threshold 60%之前添加)。然后,您可以在文件opacity.png中预览不透明度通道。

我把它放在棋盘上,这样你就可以看到透明区域。您可能希望更改-posterize参数以设置粒度,然后更改为低于80%且不受影响的阈值。

为了微调方法,使用此命令生成渐变,将其转换为步骤并丢弃一些步骤:

convert -size 256x256 xc:red                                    \
  \( gradient:white-black -posterize 20 -white-threshold 50% \) \
  -compose copyopacity -composite result.png

enter image description here

更改2050%以更改步数和截止值。

如果你想像Photoshop一样在棋盘(棋盘)上进行合成,那么你可以看到透明度,使用它:

composite -compose Dst_Over -tile pattern:checkerboard result.png preview.png

enter image description here

原始答案

首先构建透明蒙版,然后将其用作原始图像的不透明度。

所以,做一个渐变 - 或者你想要的任何其他透明度:

convert -size 400x400 gradient:black-white       \
   -fill white -draw "rectangle 100,100 300,300" \
   -fill black -draw "rectangle 150,150 250,250" \
   -define png:color-type=0 alpha.png

enter image description here

拍摄纯红色图片:

convert -size 400x400 xc:red red.png

enter image description here

现在将alpha / opacity图层应用于实体图像:

convert red.png alpha.png -compose copyopacity -composite result.png

enter image description here

答案 1 :(得分:0)

您也可以使用 ImageMagick -fx运算符以完全不同的方式执行此操作,该运算符允许您编写任何您喜欢的程序。但要注意,它会被解释,因此对于大型图像来说速度很慢。

因此,您可以拍摄原始图像并为其添加Alpha图层(-alpha opaque),然后选择新的Alpha通道(-channel A)作为影响-fx的通道。然后,您可以按照以下几行编写响应曲线:

convert image.png -alpha opaque -channel A -fx "lightness < 0.9 ? 1 : 1-lightness" result.png

enter image description here

基本上,-fx就像一个函数调用,它可以返回一个数字,并且作为-channel A选项的结果,该数字将被应用为alpha通道。公式表示...... &#34;如果像素亮度小于90%,则使其不透明,否则使其透明度与亮度成比例。&#34;

作为解释,这里是黑白渐变。

convert -size 256x256 gradient:black-white result.png

enter image description here

此处适用于-fx

convert -size 256x256 gradient:black-white -fx "lightness < 0.3 ? 1 : 1-lightness" result.png

enter image description here

如果您将此作为Alpha通道使用,则可以看到最暗的30%图像将是不透明的(alpha为白色),中间调和高光将逐渐变得更透明(alpha为黑色)。

如果您不喜欢这种方法,如果您喜欢这种方法,但由于-fx它太慢了,您可以预先制作任何渐变/响应曲线,如上一段所述,然后应用使用 ImageMagick -clut运算符,可以反复使用数千张大图像。因此,您实际上是在创建预先构建的不透明度查找表,然后将其作为查找应用于所有图像。我还没有对此进行测试,但它看起来像是:

初始步骤 - 只需执行一次:

convert -size 256x1! gradient:black-white -fx "lightness < 0.3 ? 1 : 1-lightness" clut.png

主要处理循环

convert image.jpg \( +clone -colorspace HSL -separate -delete 0,1 -normalize -clut clut.png \) -compose copyopacity -composite result.png