我有以下用于模糊图像中面部的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
作为一个数组,它应该自动转义我路径中的空格 - 相同的效果:无。
答案 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};