我正在尝试在我的Node.js应用中使用GraphicsMagick库来动态处理图像。
使用以下方法选择图像后
var image = gm('/path/to/image.jpg');
我想对它执行几项操作。我面临的问题是因为要执行的操作来自变量。例如,如果模糊为true,则应模糊图像。如果比例也为真,则应缩放模糊图像。问题是,GraphicsMagic库是异步的,因此这个脚本会导致许多动作同时执行,这可能会变得非常糟糕。
这些函数接受回调,如GitHub上的this example所示。虽然它们看起来是同步的,但是answer here证实它们是异步的。
新answer here表明函数是同步的。
当我不知道正在执行哪些操作时,如何逐一对图像执行操作,同时保持非阻塞状态?
我正在考虑将在回调中执行的NextAction()函数。然后NextAction()将触发下一个动作,但我不确定如何解决这个问题。
我已经研究过StratifiedJS,但我决定反对它,因为我不想让我的应用程序进一步复杂化,我不认为我的PaaS支持它。
if(blur){
image = image.blur(blur1, blur2);
}
if(scale){
image = image.resize(resizeX, resizeY);
}
if(sepia){
image = image.sepia();
}
答案 0 :(得分:1)
GraphicsMagick 不会执行任何操作并且工作:调整大小,模糊等等。它们非常轻量级。
实际上他们所做的一切 - 是为链添加参数(字符串到参数数组)。
因此gm()
返回的对象是链对象,在执行write
方法之前不会做太多。
当调用write
方法时,它实际上会生成所有参数都将被传递给的进程,这就是所有计算都发生的地方,这就是为什么它是异步的。
因此,为了制作您的可选方法 - 您完全按照您需要的方式执行:
if(blur){
image = image.blur(blur1, blur2);
}
if(scale){
image = image.resize(resizeX, resizeY);
}
if(sepia){
image = image.sepia();
}
最后image
将包含参数数组,并向其调用write
,将执行所有这些参数。每当你调用这些方法时,你可以在这里查看:https://github.com/aheckmann/gm/blob/master/lib/args.js
他们所做的就是返回带有附加参数的新修改对象。
以下是有关此问题及其工作原理的更多详情和说明:https://stackoverflow.com/a/17745079/1312722