【问题标题】:Complex Imagemagick command via ProcessBuilder通过 ProcessBuilder 的复杂 Imagemagick 命令
【发布时间】:2017-06-26 13:00:09
【问题描述】:

我正在尝试让以下 ImageMagick 命令与 Java 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 转义字符 ``
  • 将命令拆分为单个数组项(例如“(”、“+clone”、“-alpha”)

我错过了什么?

【问题讨论】:

  • 我可能错了,但是列表中的命令不需要是实际命令吗?您是否尝试过使用Runtime.exec()
  • Runtime.exec() 与单个字符串似乎工作。谢谢。

标签: java command-line imagemagick processbuilder


【解决方案1】:

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

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,每个字符串都会逐字传递给被调用的可执行文件,因此您不需要转义、引号或反引号。

【讨论】:

  • 我已经尝试过了(我列表的最后一点)。但是如果我拆分它们,我会得到以下错误:Unzul�ssiger Parameter - ((我不知道确切的英文翻译,例如“Invalid/Incorrect parameter - (")
  • 可能是因为你将“-(”放在一个参数中。如果没有看到你的实际代码就很难诊断。但我同意我的观点,你应该使用不同的字符串。
  • 我使用了你的代码 sn-p。 “-”号是例外的一部分,而不是命令列表的一部分。
  • 如果你给我一个应该在命令提示符下工作的“原始”IM 转换命令,我会试一试。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我知道有点晚了,但我的回答仍然可以帮助别人。

    我正面临similar problem 的复杂查询。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多