PHP GD & Imagick - 有什么方法可以测量图像处理进度吗?

标签 php imagemagick gd imagick

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

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

  1. 有关操作的详细信息在客户端收集并发布到服务器
  2. 在 POST 时,进程栏从 0% 开始在客户端呈现。
  3. 服务器运行 GD 或 Imagick 并处理图像,在此期间将进度更新数据返回给客户端。
  4. 使用 JavaScript 更改进度条的进度宽度,以反射(reflect)返回的进度数据。
  5. 最终,当图像处理进度完成时,新文件名将发送回客户端,并且标记的 src 会更新。
  6. 在图像上检测到 onload 事件,最终在渲染后,进度条达到 100%,并向用户显示图像。

如果没有可能从 GD 或 Imagick 检索进度数据,有人可以建议一种“伪造”的方法吗?

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

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

有什么想法吗?

编辑 - 我刚刚看到 ImageMajick 的命令行版本具有返回进度的选项“-monitor”,因此我可以通过每 50 毫秒轮询一次或所以。然而,GD 是否有类似的东西,因为我们根据所需的操作同时使用 GD/Imagick。

最佳答案

你是对的,如果将 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);

关于PHP GD & Imagick - 有什么方法可以测量图像处理进度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155199/

相关文章:

php - 帮助我在 Mysql 中创建巨大的数据库

pdf - 如何运行imagemagick将多个PDF文件仅第一页批量转换为JPEG?

PHP GD 编辑 Jpeg 无需重新压缩

php - 如何在 Wheezy Debian php 5.6 中安装 php5-gd

php - 检查数据库中是否存在单词以及相邻列的输出数据是否为真

php - 将中间件应用于 Laravel 5.4 中除 `setup/*` 之外的所有路由

javascript - 用于显示数据库数据的 AJAX

ruby - 无法 'brew link' imagemagick

linux - 如何从命令行批量将图像大小调整为最大 2MB?

php - 使用 GD PHP 为 PNG 图像添加水印时的部分黑色背景