当前位置: 首页 > 知识库问答 >
问题:

通过ProcessBuilder执行复杂的Imagemagick命令

赵景曜
2023-03-14

我正在尝试使用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.

似乎这些命令的解释方式不正确

我尝试过以下几种可能性,但大多数都有相同的结果。

  • 逃生路径
  • 删除PowerShell转义字符"
  • 将命令拆分为单个数组项(例如. "(", " clone","-alpha")

我错过了什么?

共有3个答案

陈浩
2023-03-14

我知道现在有点晚了,但我的答案仍然可以帮助某人。

我在复杂的查询中也遇到了类似的问题。

对于具有一个或多个大括号和多个操作的复杂查询,将每个参数及其值嵌入为单独的字符串并不总是有帮助的。

我有一个复杂的查询,我可以从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();
        }
元嘉木
2023-03-14

转换exe图像。png(克隆-alpha mask.png-合成变暗-合成“”)-合成不透明度-合成输出。巴布亚新几内亚

我认为这不是一个有效的命令。如果没有值,则不能使用-alpha。也许你想要-阿尔法提取物?

晏沈义
2023-03-14

您错过的是,每个参数实际上应该是自己的单个字符串,类似于:

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等格式。使用它可以对图片进行切割、旋转、组合等多