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 有什么类似的东西,但是我们根据所需的操作同时使用 GD/Imagick。

4

2 回答 2

1

也许您可以使用侦听器和事件的集合来识别源进度,然后通知客户端。

您可以使用React或纯 lib 事件来使此进度异步。

于 2012-08-07T23:44:18.697 回答
1

没错,如果将 ImageMagick 与 exec 一起使用,您可以添加-monitor选项,在后台运行命令并将输出发送到文件

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

然后定期读取该文件。

您也可以使用Imagick扩展包装器并使用 Imagick::setProgressMonitor. 结合 HTML5 服务器发送的事件会很好。

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 回答