ImageMagick和Java Runtime Exec的问题

时间:2010-01-27 15:20:40

标签: java command-line terminal imagemagick runtime.exec

我有一个奇怪的问题,我知道没有java专家可以解决..

我需要在我的应用程序上使用imagemagick将我网站上的电子邮件转换为图像,这样就没有底池可以轻松收集电子邮件了...问题解决了图像magick命令行如下 convert -size 200x30 xc:transparent -font /home/emad/TITUSCBZ.TTF -fill black -pointsize 12 -draw“text 5,15'emadhegab@hotmail.com'”/ home / emad / test.png

它真的像魔术一样工作,所以我试着把它放在java上运行它 调用Runtime.getRuntime()。EXEC(命令) 但结果令人遗憾地失望..我现在有图像作为输出..但内部没有文字..我做了一个sys出来看到命令并采取了outed的命令,并把它放在终端,它工作..所以运行时的问题有些如何.. java的代码是..如果你要问

=================

            String size = ("1000x1030");

    String path = System.getProperty("user.home");
    String command="convert -size "+ size +" xc:white -font /tmp/TITUSCBZ.TTF -pointsize 12 -draw 'text 300,300 \"emadhegab@hotmail.com\"' "+path +"/test.jpg";
    try{
    Process proc =Runtime.getRuntime().exec(command);

    System.out.println(command);
    }catch(Exception e){
        System.out.println("error");
    }

=================

它会给你空白的图片..任何人都有解决方案

4 个答案:

答案 0 :(得分:2)

你需要传递命令,它的args是一个String数组,而不是String连接。

String[] cmd = {"convert",  "-size", "size", "c:white", ..., path +"/test.jpg"};

答案 1 :(得分:0)

这个java程序是由您运行还是由Web服务器运行?

因为如果是后者,很可能属性user.home没有你期望的值。

此外,位置(300,300)和字体位置(/tmp/TITUSCBZ.TTF)与您首先给出的示例不同。也许你应该仔细检查一下。

答案 2 :(得分:0)

你应该:

  1. 创建一个读取进程输出的线程。也许你的进程回答的(平台相关的)缓冲区填满了(JVM可能会死锁)。

  2. 也许java找不到“转换”命令...使用重载版本的“exec”,它将当前dir作为参数(http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec(java.lang.String,%20java.lang.String[],%20java.io.File

答案 3 :(得分:0)

这对我有用:

String size = "1024x768";
ProcessBuilder pb = new ProcessBuilder("convert", "-size", size,
        "xc:white", "-font",
        "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf",
        "-pointsize", "12", "-draw",
        "text 300,300 \"*****@hotmail.com\"",
        "/home/djo/Pictures/rainy.jpeg");
pb.redirectErrorStream(true);

Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while((line=br.readLine())!=null){
    System.out.println(line);
}
System.out.println(p.waitFor());

请注意,我从绘图部分取下了单引号。