我可以将命令与gm一起用于node.js吗?

时间:2016-09-22 07:00:01

标签: node.js gm

使用gm(节点的GraphicsMagick库)时,我可以将两个或多个命令链接在一起吗?

具体来说,我有一个我想要添加文字的图像,然后在上面添加水印,但我尝试的任何东西似乎都没有用。

我尝试使用gm(image).drawText(0,0,"Text").composite(logo) ...,但这告诉我Unrecognized option (-draw)。类似的事情,当我先合成,然后绘制文字。

我还尝试编写文件,然后将.drawText调用添加到结尾,但这不起作用。

我可以将两个或多个命令链接在一起吗?

2 个答案:

答案 0 :(得分:1)

是的,你可以,但不是在这种情况下。你可以做一些解决方法,两次调用gm并将第一次调用的结果传递给另一个:

const stream = require('stream');
const passThrough = new stream.PassThrough();

gm(image).drawText(0, 0, 'Text').stream().pipe(passThrough);
gm(passThrough).composite(logo).write('./output.png', e => console.log(e || 'OK'));

说实话gm图书馆很糟糕。如果您对GraphicsMagick一无所知,gm无法提供足够好的抽象来隐藏它。你经常被迫使用像.resize(240, 240, '!')这样的结构,除非你知道GraphicsMagick的-resize选项的语法,否则没有任何意义。那是因为当你调用gm的方法时,它只是向一些GraphicsMagick命令附加选项,当你执行.write()方法时会调用它,这就是这种方法失败时的一种情况。 GraphicsMagick提供了一些支持不同选项的命令。最常用的命令是convert,它支持-draw方法使用的.drawText()选项。另一个命令是composite,用于将图像合并到一起 - 它不支持-draw选项。当您使用.composite()方法gm使用composite命令时,.drawText()方法开始失败。因此,您可以链接.drawText().resize()等方法,但不能链接.drawText().composite()

答案 1 :(得分:1)

您可以使用toBuffer并将其传递给下一个gm电话(此特定代码未经过测试,但我使用了类似的AWS Lambda技术)。

gm(image)
  .drawText(0, 0, 'Text')
  .toBuffer('PNG',function (err, buffer) {
    if (err) return handle(err);
    gm(buffer)
      .composite(logo)
      .write('./output.png', e => console.log(e || 'OK'));
    console.log('done!');})