我有一个裁剪网页,可让用户上传图片,调整宽高比,缩小/增加裁剪区域和裁剪。实际裁剪由php
脚本完成,该脚本从命令行调用Gimp。
系统完美运行。但是,只需加载Gimp就可以测量~8秒。我想减少这个。
据我所知,如果我在一个终端加载Gimp,加载需要8秒。如果我然后将另一个图像加载到Gimp中,则加载时间会大大减少。我想将此应用于apache2的APACHE_RUN_USER
,这是网络服务器运行的用户名。
有没有让apache2的APACHE_RUN_USER
加载Gimp?我有一个脚本将加载Gimp并且只是坐下:
#!/bin/bash
gimp -i -b - >/dev/null 2&1
read -n 1 INPUT
但我不知道如何实现这一点,即使它是可能的。有人可以给我一些见解吗?
答案 0 :(得分:2)
有趣的问题! Gimp包含一个TCP Script-Fu server,我们可以从命令行运行:
gimp -i -b '(plug-in-script-fu-server 1 "127.0.0.1" 10008 "/path/to/log")'
这启动了一个无头服务器,它在端口10008上侦听127.0.0.1。它是我们可以通过过滤器→脚本 - 傅立即启动服务器... 下的UI启动的服务器。您可以尝试添加-d
选项以跳过加载模式,渐变,调色板和画笔,或添加-f
选项以跳过字体(以便更快地启动和降低内存使用)。然后我们可以将用Scheme编写的Script-Fu语句发送到该套接字。以下是PHP的使用方法:
$script = '(gimp-message "Hello Gimp!")';
$scriptLength = strlen($script);
$highByte = (int)($scriptLength / 256);
$lowByte = $scriptLength % 256;
$packet = pack('C3a*', ord('G'), $highByte, $lowByte, $script);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 10008) or die('connect error');
socket_write($socket, $packet, strlen($packet)) or die('write error');
socket_close($socket);
这实现了那个链接中定义的(非常简单的)协议。对于任何严肃的用途,它需要更好的错误处理,但它对于演示来说很好。如果我们调用此脚本,我们应该在服务器日志文件中看到连接信息,控制台应该显示:
启动服务器 - 警告:Hello Gimp!
在UI中,这将打开一个包含该消息的对话窗口。根据您的环境,Gimp或PHP可能没有套接字创建功能。您可以尝试以root 运行两者来测试它。
尽管很酷,我也很同情其他评论者:ImageMagick或GD可能是大型应用程序的更好选择。我听到了您的担忧,但Gimp并非专为网络规模部署而设计。它最重要的是桌面应用程序并使用大量资源。如果担心安全问题,Gimp可能会暴露我们通常在Web环境中看不到的攻击面(可能包括执行任意Scheme代码的服务器!)。您可能还想考虑维护用于与Gimp交互的本地客户端库的成本。
那就是说,如果你能证明这个项目的合理性,我认为这会很有趣。
注意: