1

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

具体来说,我有一张我想添加文本的图像,然后在其上添加水印,但我尝试的任何方法似乎都不起作用。

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

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

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

4

2 回答 2

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无法提供足够好的抽象来隐藏它。除非您知道 GraphicsMagick选项的语法,否则您经常被迫使用.resize(240, 240, '!')没有意义的结构。-resize那是因为当您调用gm's 方法时,它只是将选项附加到某些 GraphicsMagick 命令,当您执行方法时将调用该命令,.write()这是这种方法失败的情况之一。GraphicsMagick 提供了一些支持不同选项的命令。最常用的命令是convert,它支持例如方法-draw使用的选项.drawText()。另一个命令composite用于将图像合并在一起 - 它不支持-draw选项。当您使用.composite()方法时gm使用composite命令,因此.drawText()方法开始失败。因此,您可以链接类似.drawText()and的方法.resize(),但不能链接.drawText()and .composite()

于 2016-09-22T09:21:28.800 回答
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!');})
于 2017-01-03T03:07:01.330 回答