我正在开发一个Node.js应用程序,该应用程序从Web服务加载图像,使用ImageMagick处理缩略图,并将结果保存回此Web服务。工作流程类似于
[Web Service] ==> HTTP Response Stream ==> ImageMagick ==> HTTP Request Stream ==> [Web Service]
我正在使用Node.js http
模块检索原始图像流并保存缩略图流,并使用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'); // define ImageMagick parameters var thumbnail = im().thumbnail(options.width + '>x' + options.height + '>').quality(options.quality); // retrieve original image http.request('my web service', function (res) { // generate thumbnail res.pipe(thumbnail); // pipe the thumbnail into memory stream (paused) in order to retrieve its length var ms = new MemoryStream(); ms.pause(); thumbnail.pipe(ms); var length = ms._getQueueSize(); // save back http.request('my web service', length, function (res) { // ... }); ms.pipe(req); ms.resume(); });