异步GraphicsMagick For Node

时间:2013-07-19 10:48:44

标签: node.js graphicsmagick node-imagemagick

我正在使用GraphicsMagick作为节点。我基本上裁剪照片并检索用户上传的照片的exif数据。我不想阻止等待这些任务完成的请求流,因此我需要使用异步函数来完成。而且我认为我应该能够这些是node.js自身异步的I / O操作。

但是我看到GraphicsMagick节点中的所有函数都是同步函数。所以我无法确定如何实现我想要的目标。

我想到的一个想法是编写一个带回调的函数,并在其中完成GraphicsMagick处理。并使用.nextTick()函数实现异步流程。但我不完全确定这是否正常。还有GraphicsMagick的任何异步函数。

请帮助我,我们非常感谢如何从graphicsmagick获取异步函数。

3 个答案:

答案 0 :(得分:5)

<强>更新
来自@Saransh Mohapatra的实际答案实际上是错误的。因为经过很少的调查后发现所有对图像执行操作的方法实际上都没有执行任何操作,只是在列表中附加参数,这些参数将在您write之后使用或调用任何与缓冲区相关的方法执行以获取/写实际图像缓冲区。

以下是blur的示例中的详细信息:

  1. 我们致电blurhttps://github.com/aheckmann/gm/blob/master/lib/args.js#L780
  2. 致电this.out,会致电:https://github.com/aheckmann/gm/blob/master/lib/command.js#L49
  3. 构建它时有哪些方法:https://github.com/aheckmann/gm/blob/master/lib/command.js#L34
  4. 它所做的一切 - a.push(arguments[i]);然后将其连接到所有列表(到其他参数)。
  5. 多数民众赞成。
  6. 然后调用write时:

    1. https://github.com/aheckmann/gm/blob/master/lib/command.js#L62
    2. 它获取参数列表self.args()https://github.com/aheckmann/gm/blob/master/lib/command.js#L78
    3. 仅过滤掉一些保留字段:https://github.com/aheckmann/gm/blob/master/lib/command.js#L274
    4. 那么这些参数将加入_spawn write operationshttps://github.com/aheckmann/gm/blob/master/lib/command.js#L187
    5. 多数民众赞成。
    6. 因此,基于此,任何使{{1}}覆盖图像但不保存或保留缓冲区的方法 - 不需要任何异步,因为它们实际上根本不做任何工作。 这意味着 - 你需要担心它们。

      <强> OLD:
      任何重型加工的最佳方法是使用单独的流程 你可以创建另一个小的node.js进程,它与主进程有一些通信能力(ZeroMQ在这里是个不错的选择)。

      这个单独的流程必须通知文件(路径)以及如何处理,您可以轻松地从主流程发送数据,通过 ZeroMQ 进行此类决策。

      这种方法可以让你在main(web?)节点处理工作的方式中具有独立性,并且将来可以扩展到单独的硬件/实例。
      这也是非常好的做法( unix-like 应用程序逻辑分离)。

答案 1 :(得分:4)

以下是如何宣传gm:

var Promise = require('bluebird');
var gm = require('gm').subClass({imageMagick: true});
Promise.promisifyAll(gm.prototype);

gm('1.jpg')
  .resize(240, 240)
  .noProfile()
  .writeAsync('1b.jpg')
  .then(function () {
    console.log('done');
  });
  .catch(function (err) {
    console.log(err);
  });

https://github.com/aheckmann/gm/issues/320

答案 2 :(得分:1)

很抱歉我的观察错了,虽然GraphicsMagick模块似乎是同步功能,但它们不是。每次操作都会产生子进程。这已得到确认here

所以其他人都在寻找这个问题, GraphicsMagick函数是异步的。而且你不需要做任何事情。它是一个非常好的模块,值得一试。

感谢。