PHP GD&想象 - 有没有办法衡量图像处理进度?

时间:2012-06-22 11:19:37

标签: php imagemagick gd imagick

我的应用程序的一部分包括大量使用图像处理功能,例如裁剪,调整大小,滤镜,亮度等。

在进行图像处理时,是否还要测量GD和/或ImageMajick的进度?我希望能够以下列方式呈现进度条客户端: -

  1. 有关操作的详细信息在客户端收集并发布到服务器
  2. 在POST时,一个procress bar从客户端开始,从0%开始。
  3. 服务器运行GD或Imagick并处理图像,在此期间它将进度更新数据吐回客户端。
  4. 使用javascript更改进度条的进度宽度以反映返回的进度数据。
  5. 最终,当图像处理进度完成时,新文件名将被发送回客户端,标签的src将更新。
  6. 在图像上检测到onload事件,最后一旦渲染,进度条达到100%,图像就会显示给用户。
  7. 如果没有可能从GD或Imagick中检索进度数据的方法,有人会建议某种方式“假装”吗?

    我考虑在POST之前渲染一个空的进度条,一旦操作发生并且客户端收到ajax响应,它就会将其设置为70%。然后通过检测onload事件,一旦新图像完全加载,最后动画为100%。

    如果这是我唯一的选择,那就这样吧。但对我来说感觉相当'笨重'。

    有什么想法吗?

    编辑 - 我刚刚看到ImageMajick的命令行版本有'-monitor'选项可以返回进度,所以我可以通过每隔50ms轮询一次来解决问题所以。是否有任何类似的GD,因为我们使用GD / Imagick取决于所需的操作。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

你是对的,如果在exec中使用ImageMagick,你可以添加-monitor选项,在后台运行命令并将输出发送到文件

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

然后定期读取该文件。

此外,您可以使用Imagick extesnion包装器并设置回调函数 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);