从java调用imagemagick无效,直接调用工作

时间:2014-12-07 18:16:56

标签: java imagemagick

我有以下用于模糊图像中面部的java代码 - 变量convert设置为/usr/bin/mogrify

//String []cmd = {convert, "-region", f.w+"x"+f.h+"+"+x+"+"+y, "-blur 0.0x10.0", path};

String cmd = convert + " -region " + f.w+"x"+f.h+"+"+x+"+"+y + " -blur 0.0x10.0 " + "\"" + path + "\"";

System.out.println(cmd);
// System.out.println(strJoin(cmd, " ")); 
Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader in = new BufferedReader(  
                        new InputStreamReader(p.getInputStream()));  
    String line = null;  
    while ((line = in.readLine()) != null) {  
        System.out.println(line);  
    }  
p.waitFor();

但是图像上没有任何反应。

程序还输出它将调用的命令行,例如:

/usr/bin/mogrify -region 37x44+1759+881 -blur 0.0x10.0 "/home/self/.wine/drive_c/windows/profiles/self/My Pictures/test/pic00164.jpg"

如果我手动调用此行,一切正常。

从评论中可以看出,我也尝试提供cmd作为一个数组,它应该自动转义我路径中的空格 - 相同的效果:无。

2 个答案:

答案 0 :(得分:1)

永远不要手工构建命令行 - 没有单一的便携式解决方案。它仅适用于极少数情况,命令行中不存在空格或(双)引号。

改为使用流程构建器:

ProcessBuilder pb = new ProcessBuilder(
    convert, "-region", f.w+"x"+f.h+"+"+x+"+"+y, "-blur 0.0x10.0", path);
pb.redirectError();
Process process = pb.start();
BufferedReader in = new BufferedReader(
    new InputStreamReader(process.getInputStream()));

答案 1 :(得分:0)

getErrorStream() - 正如评论中所提到的 - 是成功的关键。逃跑并没有像我尝试的那样发挥作用。然后我用数组尝试了它,发现我必须拆分模糊选项。

这有效:

String []cmd = {convert, "-region", f.w+"x"+f.h+"+"+x+"+"+y, "-blur", "0.0x10.0", path};