2017-06-26 35 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