我正在尝试使用Java ProcessBuilder获得以下ImageMagick命令:
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);
}
这是来自流程构建器的ourput:
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.
似乎这些命令的解释方式不正确
我尝试过以下几种可能性,但大多数都有相同的结果。
"
我错过了什么?
我知道现在有点晚了,但我的答案仍然可以帮助某人。
我在复杂的查询中也遇到了类似的问题。
对于具有一个或多个大括号和多个操作的复杂查询,将每个参数及其值嵌入为单独的字符串并不总是有帮助的。
我有一个复杂的查询,我可以从java执行,如下所示,即Imagemagick查询:
convert D:\img-query\complex\tect.jpg (
+clone
-alpha extract
-draw "fill black polygon 0,0 0,50 50,0 fill white circle 50,50 50,0"
( +clone -flip )
-compose Multiply
-composite ( +clone -flop )
-compose Multiply
-composite
)
-alpha off
-compose CopyOpacity
-composite D:\img-query\complex\round.png
工作java代码(在window cmd和centOS中工作):
try {
List<String> commands = new ArrayList<>();
commands.add("D:/img-query/complex/tect.jpg");
commands.add(reSizedCoverBefor3D);
commands.add("(");
commands.add("+clone");
commands.add("-alpha");
commands.add("extract");
commands.add("-draw");
commands.add("fill black polygon 0,0 0,2 2,0 fill white circle 2,2 2,0");
commands.add("(");
commands.add("+clone");
commands.add("-flip");
commands.add(")");
commands.add("-compose");
commands.add("Multiply") ;
commands.add("-composite");
commands.add("(");
commands.add("+clone");
commands.add("-flop");
commands.add(")") ;
commands.add("-compose");
commands.add("Multiply") ;
commands.add("-composite");
commands.add(")");
commands.add("-alpha");
commands.add("off");
commands.add("-compose");
commands.add("CopyOpacity");
commands.add("-composite");
commands.add(D:/img-query/complex/round.png");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.inheritIO();
try {
Process p = pb.start();
int j = p.waitFor();
int exitValue = p.exitValue();
System.out.println("Finished with code: " + j);
System.out.println("Finished with exitValue: " + exitValue);
} catch (Exception e) {
System.out.println("asdasdasd: " + e);
}
} catch (Exception e) {
e.printStackTrace();
}
转换exe图像。png(克隆-alpha mask.png-合成变暗-合成“”)-合成不透明度-合成输出。巴布亚新几内亚
我认为这不是一个有效的命令。如果没有值,则不能使用-alpha。也许你想要-阿尔法提取物?
您错过的是,每个参数实际上应该是自己的单个字符串,类似于:
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,因此每个字符串都逐字传递给被调用的可执行文件,因此您不需要转义、引号或反引号。
我正在尝试使用ProcessBuild运行cmd语句。 但是,我只能打开cmd。exe 那么如何编写此语句通过java运行cmd命令??我得到了错误,因为语句由"*"组成。如何编辑ProcessBuilder以便我可以运行语句?非常感谢
问题内容: 当我使用执行命令时,它如何知道在哪里寻找该命令?使用此技巧,我将PATH变量(通过检查进行了验证)修改为错误(空,工作目录等),但ProcessBuilder仍然可以执行sort,echo,bash等。它是怎么做到的? 注意:我特定的开发环境是OSX,但是此代码也将在Red Hat Enterprise Linux上运行。 问题答案: 该文件说 一个命令,一个字符串列表,表示要调用的外
问题内容: 我有一个CentOS 5.7 linux服务器,并使用php5.3.x。 在pfSense系统上,您可以使用php网页重新启动需要root权限的服务。 我正在尝试做类似的事情,我已经写了一些php代码来执行shell命令。例如,重新启动sshd服务: 我试图通过exec函数执行该命令,但是它需要root权限,但是我们拥有apache用户权限。 我遇到了一些解决方案: “以root用户运
I使用Processbuilder如下所示: 在方法中,我设置要执行的linux命令,如下所示: 我可以从终端执行相同的命令。
我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?
本文向大家介绍深入浅析ImageMagick命令执行漏洞,包括了深入浅析ImageMagick命令执行漏洞的使用技巧和注意事项,需要的朋友参考一下 00 前言 什么是ImageMagick? ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以对图片进行切割、旋转、组合等多