我试图让下面的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的转义字符
``
- 斯普利特在单个阵列中物品的命令(例如, “(”, “+克隆”, “-α”)
做什么我错过了吗?
我可能是错的,但是列表中的命令不需要是实际的命令吗?你有没有尝试过使用'Runtime.exec()'? –
Runtime.exec()与一个字符串似乎工作。谢谢。 – Xerox23