2

私のアプリの一部には、トリミング、サイズ変更、フィルター、明るさなどの機能を備えた画像処理が多用されています。

画像操作が行われている間に GD や ImageMajick の進行状況を測定する方法はありますか? 次の方法でプログレスバーのクライアント側をレンダリングできるようにしたいと思います:-

  1. 操作に関する詳細はクライアント側で収集され、サーバーに投稿されます
  2. POST では、プロセス バーがクライアント側で 0% からレンダリングされます。
  3. サーバーはGDまたはImagickを実行し、画像を処理し、その間に進行状況の更新データをクライアントに返します。
  4. プログレス バーのプログレス幅は、返されたプログレス データを反映するために JavaScript で変更されます。
  5. 最終的に画像操作の進行が完了すると、新しいファイル名がクライアントに送り返され、タグの src が更新されます。
  6. 画像で onload イベントが検出され、最終的にレンダリングされると、プログレス バーが 100% に達し、画像がユーザーに表示されます。

GD または Imagick から進行状況データを取得する方法がない場合、だれかが「偽造」する方法を提案できますか?

POST の前に空のプログレス バーをレンダリングし、操作が行われ、クライアントが ajax 応答を受信したら 70% にアニメーション化することを検討しました。次に、onload イベントを検出して新しいイメージが完全に読み込まれると、最終的に 100% にアニメーション化されます。

これが私の唯一の選択肢である場合は、そうしてください。しかし、それは私にはかなり「不格好」に感じます。

何か案は?

編集- ImageMajick のコマンド ライン バージョンに進行状況を返すオプション「-monitor」があることを確認したので、これを 50 ミリ秒ごとにポーリングすることで何かをノックアップできる可能性があります。ただし、必要な操作に応じて GD/Imagick の両方を使用するため、GD に似たものはありますか。

4

2 に答える 2

1

そうです、ImageMagick を exec で使用する場合、-monitorオプションを追加し、バックグラウンドでコマンドを実行して出力をファイルに送信できます

convert opts -monitor > /path/to/progress.txt 2>/path/to/progress.txt &

そのファイルを定期的に読み取ります。

Imagickまた、拡張ラッパーを 使用して、でコールバック関数を設定することもできますImagick::setProgressMonitor。HTML5 Server-Sent Events と組み合わせると便利です。

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$callback = function($offset, $span){

    echo "data: ".(100 * $offset) / $span."\n\n";
    flush();
    return true;
}

$imagick->setProgressMonitor($callback);
$imagick->waveImage(2, 15);
于 2016-10-14T03:56:56.717 に答える