私は、Web サービスから画像を読み込み、ImageMagick を使用してサムネイルを処理し、結果をこの Web サービスに保存する Node.js アプリケーションに取り組んでいます。ワークフローは次のようなものです
[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 サムネイル = im().thumbnail(options.width + '>x' + options.height + '>').quality(options.quality);
// 元の画像を取得
http.request('私の Web サービス', function (res) {
// サムネイルを生成
res.pipe(サムネイル);
// その長さを取得するためにサムネイルをメモリ ストリーム (一時停止) にパイプします
var ms = new MemoryStream();
ms.pause();
サムネイル.パイプ(ミリ秒);
変数の長さ = ms._getQueueSize();
// セーブバック
http.request('my web service', length, function (res) {
// ...
});
ms.pipe(必須);
ms.resume();
});