我正在开发一个 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(); });