如何有效地修剪图像的透明边框?

时间:2019-04-21 03:12:36

标签: node.js imagemagick image-manipulation graphicsmagick imagefilter

我想使用Node.js自动化从PNG图像修剪透明边缘的过程,而是使用CLI工具(由 child_process )或具有本机绑定而非纯JavaScript实现的Node模块。

这听起来像是一个相当简单的任务,但是我搜索了数周却没有任何符合我需要的结果。

  • 无论输入图像是什么样子,修剪例程都应搜索透明像素。大多数实现都会检查左上方像素的颜色。
  • 修整例程应该可以使用公差值进行配置,因此任何不透明度小于或等于20%的东西都将被删除,而不是严格检查不透明度为0%。

我目前使用锐化 GraphicsMagick 用于复杂的图像处理链,但是由于我没有找到用于透明修剪的工具,因此我编写了自定义 Jimp 插件,该插件以相当低效的方式处理修整作业,但仍在工作。

这是示例输入图像:

https://i.imgur.com/E1j6NjP.png

以及预期的输出图像:

https://i.imgur.com/3k9V2ac.png

我想摆脱吉普。

1 个答案:

答案 0 :(得分:0)

Sharp所使用的图像处理库

libvips具有find_trim

在您的情况下,您只想测试Alpha通道(频段3),请提取该通道并搜索非零值的边界框:

$ vips extract_band test-transparency.png x.png 3
$ vips find_trim x.png --background 0 --threshold 20
0
0
722
639

这就是您想要的区域的左/上/宽/高。您可以使用以下方法从原始图像中裁剪出来:

$ vips crop test-transparency.png y.png 0 0 722 639

制作:

sample output

您可以通过以下方式将其作为单排使用:

$ vips crop test-transparency.png y.png $(vips extract_band test-transparency.png x.png 3; vips find_trim x.png --background 0 --threshold 20)

您可以在Python中提高效率:

#!/usr/bin/python3

import sys
import pyvips

image = pyvips.Image.new_from_file(sys.argv[1])
left, top, width, height = image[3].find_trim(background=0, threshold=20)
image = image.crop(left, top, width, height)
image.write_to_file(sys.argv[2])

然后解决这个问题。当然,您可能不想将py添加为依赖项。