如何以有效的方式从我的图像中修剪透明边框?

问题描述 投票:0回答:1

我想自动使用Node.js修剪PNG图像的透明边缘的过程,而是使用CLI工具(由child_process调用)或具有本机绑定的Node模块,而不是纯JavaScript实现,这是出于性能原因。

这听起来像一个相当简单的任务,但我正在寻找几周没有任何符合我需要的结果。

  • 无论输入图像是什么样的,修剪例程都应该搜索透明像素。大多数实现都会检查左上角像素的颜色。
  • 修剪程序应该可以配置公差值,因此任何具有20%或更低不透明度的东西都会被删除,而不是严格检查0%的不透明度。

我目前使用SharpGraphicsMagick进行复杂的图像处理链,但由于我没有找到透明修剪工具,我写了一个自定义的Jimp插件,以一种相当低效的方式处理修剪工作,但它仍然有效。

这是一个示例输入图像:

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

和预期的输出图像:

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

我想摆脱Jimp。

node.js imagemagick image-manipulation graphicsmagick imagefilter
1个回答
0
投票

libvips,sharp使用的图像处理库,有find_trim

在你的情况下你只想测试alpha通道(band 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添加为依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.