2017-06-26 52 views
0

我试图让下面的ImageMagick命令与Java的ProcessBuilder工作:复杂ImageMagick的命令通过的ProcessBuilder

convert.exe image.png `(`+clone -alpha extract mask.png -compose Darken -composite `) -compose CopyOpacity -composite out.png 

的文件路径(源图像,掩膜图像和目标图像)进行配置。 如果我在PowerShell或Windwos Cmd中输入命令,它按预期工作。 当我试图通过Java ProcessBuilder执行相同的命令时,它失败。

这是我最后的代码:

File srcFile = new File("C:/Users/AAA/Desktop/PNG/image.png"); 
    File maskFile = new File("C:/Users/AAA/Desktop/PNG/mask.png"); 
    File destFile = new File("C:/Users/AAA/Desktop/PNG/out-1.png"); 

    List<String> commands = new ArrayList<>(); 
    commands.add("C:/Program Files/ImageMagick-6.9.1-Q16/convert.exe"); 
    commands.add(srcFile.getAbsolutePath()); 
    commands.add(" `(`+clone -alpha extract " + maskFile.getAbsolutePath() + " -compose Darken -composite `)"); 
    commands.add("-compose CopyOpacity -composite " + destFile.getAbsolutePath()); 

    ProcessBuilder pb = new ProcessBuilder(commands); 
    pb.inheritIO(); 
    try { 
     int i = pb.start().waitFor(); 
     System.out.println("Finished with code: " + i); 
    } catch (Exception e) { 
     System.out.println("asdasdasd: " + e); 
    } 

这是从进程生成器可能输出:

convert.exe: unable to open image `/Users/AAA/Desktop/PNG/mask.png -compose Darken -composite)': No such file or directory @ error/blob.c/OpenBlob/2692. 
convert.exe: no decode delegate for this image format ` (+CLONE -ALPHA EXTRACT C' @ error/constitute.c/ReadImage/501. 
convert.exe: missing an image filename `-compose CopyOpacity -composite C:\Users\AAA\Desktop\PNG\out-1.png' @ error/convert.c/ConvertImageCommand/3214. 

看来这个命令不正确的方式解释

我尝试了以下可能性,但其中大多数都具有相同的结果。

  • 逃生路径
  • 删除PowerShell的转义字符``
  • 斯普利特在单个阵列中物品的命令(例如, “(”, “+克隆”, “-α”)

做什么我错过了吗?

+0

我可能是错的,但是列表中的命令不需要是实际的命令吗?你有没有尝试过使用'Runtime.exec()'? –

+0

Runtime.exec()与一个字符串似乎工作。谢谢。 – Xerox23

回答

0

你想念的是每个参数的确应该是它自己的单个字符串,例如:

commands.add("("); 
commands.add("+clone"); 
commands.add("-alpha"); 
commands.add("extract"); 
commands.add(maskFile.getAbsolutePath()); 
commands.add("-compose"); 
commands.add("Darken"); 
commands.add("-composite"); 
commands.add(")"); 

由于不涉及shell,因此每个字符串都逐字传递给被调用的可执行文件,因此您不需要转义文件,引号或反引号。

+0

我已经试过了(我列表的最后一点)。但是,如果我将它们分开,我得到了以下错误: 'Unzul ssiger参数 - (' (我不知道确切的英文翻译,类似“Invalid/Incorrect parameter - (”) – Xerox23

+0

可能是因为您正在将“ - (“在参数中一起,很难诊断,但没有看到你的实际代码,但我坚持我的说法,你应该使用不同的字符串。 – xenoid

+0

我使用了你的代码片段。” - “符号是异常的一部分,而不是命令列表的一部分 – Xerox23

0

convert.exe image.png ( +clone -alpha mask.png -compose Darken -composite `) -compose CopyOpacity -composite out.png

我不认为这是一个有效的命令。你不能有没有价值的-alpha。也许你想要-alpha提取物?

+0

当然,我在这个例子中忘了它。 – Xerox23