使用gm
(节点的GraphicsMagick库)时,我可以将两个或多个命令链接在一起吗?
具体来说,我有一个我想要添加文字的图像,然后在上面添加水印,但我尝试的任何东西似乎都没有用。
我尝试使用gm(image).drawText(0,0,"Text").composite(logo) ...
,但这告诉我Unrecognized option (-draw)
。类似的事情,当我先合成,然后绘制文字。
我还尝试编写文件,然后将.drawText
调用添加到结尾,但这不起作用。
我可以将两个或多个命令链接在一起吗?
答案 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!');})