【问题标题】:How do I trim transparent borders from my image in an efficient way?如何以有效的方式从图像中修剪透明边框?
【发布时间】:2019-04-21 03:12:35
【问题描述】:

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

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

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

我目前使用SharpGraphicsMagick 进行复杂的图像处理链,但是因为我没有找到用于透明度修剪的工具,所以我编写了一个自定义的Jimp 插件来处理修剪工作。效率低下,但它仍然有效。

这是一个示例输入图像:

以及预期的输出图像:

不过我想摆脱 Jimp。

【问题讨论】:

  • 您可以用 C++ 编写一个简单的算法并将其用作节点插件吗?
  • @MateuszSowiński 是的,如果我真的找不到合适的东西,这就是我要做的。不过,我宁愿不构建自己的实现,因为我必须学习 C++ 和 node-gyp。

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


【解决方案1】:

libvips,sharp使用的图像处理库,有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

制作:

您可以通过以下方式进行单线操作:

$ 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 添加为依赖项。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2018-11-19
    • 2014-04-02
    • 2013-10-02
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多