2

我正在开发一个 Node.js 应用程序,它从 Web 服务加载图像,使用 ImageMagick 处理缩略图,并将结果保存回这个 Web 服务。工作流程类似于

[Web Service] ==> HTTP Response Stream ==> ImageMagick ==> HTTP Request Stream ==> [Web Service]

我正在使用 Node.jshttp模块来检索原始图像流并保存缩略图流,并使用imagemagick-stream模块生成缩略图而不使用任何临时文件。由于我还需要发送缩略图长度,我使用memorystream模块将缩略图保存在内存中。所以工作流程改变了 [Web Service] ==> HTTP Response Stream ==> ImageMagick ==> memory stream ==> HTTP Request Stream ==> [Web Service]

该代码在我的笔记本电脑 (Mac) 和工作站 (Windows) 上运行良好,但在带有特殊 PNG 图像的 Ubuntu 服务器上却无法运行。但是这个图像在 Mac 和 Windows 上运行良好,如果我使用 ImageMagick 命令行它也可以工作,所以我认为这不是一个糟糕的图像。

现象是,在处理此图像时,我的应用程序继续等待从 ImageMagick 接收数据,这意味着它从未触发过“结束”或“错误”事件。当我在我的 Mac 上尝试时,我可以看到 ImageMagick 发出了 3 个“可读”事件,这意味着它处理了 3 个数据块。但在 Ubuntu 上,它只发出 2 个“可读”事件,然后我的代码就在那里。

我不确定为什么会这样?由于图像可以在 Mac、Windows 上处理,并且可以在 Ubuntu 上通过命令行处理,我不认为这是因为图像和 ImageMagick。我强烈怀疑处理流有什么问题,但不知道。

下面的一些伪代码

var im = require('imagemagick-stream');
var MemoryStream = require('memorystream');

// 定义 ImageMagick 参数
var thumbnail = im().thumbnail(options.width + '>x' + options.height + '>').quality(options.quality);

// 获取原始图像
http.request('我的网络服务', function (res) {
    // 生成缩略图
    res.pipe(缩略图);

    // 将缩略图通过管道传输到内存流(暂停)以检索其长度
    var ms = new MemoryStream();
    ms.pause();
    缩略图.管道(毫秒);
    var 长度 = ms._getQueueSize();

    // 保存回来
    http.request('我的网络服务', 长度, 功能 (res) {
        // ...
    });
    ms.pipe(req);
    ms.resume();
});
4

0 回答 0