проблема с ImageMagick и Java Runtime Exec - PullRequest
0 голосов
/ 27 января 2010

У меня есть небольшая странная проблема, которую ни один эксперт по Java не может решить ..

мне нужно использовать imagemagick в моем приложении, чтобы конвертировать электронные письма на моем сайте в изображения, чтобы ни один банк не мог легко принимать электронные письма ... проблема решена с помощью командной строки image magick следующим образом конвертировать -size 200x30 xc: прозрачный -font /home/emad/TITUSCBZ.TTF -замять черный 1005 * и он действительно работает как магия, и поэтому я попытался поместить это на Java, чтобы запустить его с Runtime.getRuntime (). Exec (команда) но результат, к сожалению, разочаровывает .. теперь у меня есть изображение как вывод .. но без текста внутри .. я делаю sys, чтобы увидеть команду и взял команду, которая вышла, и поместил ее в терминал, и это сработало .. так проблема во время выполнения, каким-то образом .. код 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 ]

2 голосов
/ 27 января 2010

Вам необходимо передать команду и ее аргументы в виде массива String, а не конкатенации String.

String[] cmd = {"convert",  "-size", "size", "c:white", ..., path +"/test.jpg"};
0 голосов
/ 28 января 2010

Это работает для меня:

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());

Обратите внимание, что я снял одинарные кавычки с рисованной детали.

0 голосов
/ 27 января 2010

Вы должны:

  1. Создать поток, который читает выходные данные процесса. Возможно, (зависимый от платформы) буфер для ответа вашего процесса заполняется (тогда JVM может заблокироваться).

  2. Возможно, java не удалось найти команду "convert" ... использовать перегруженную версию "exec", которая принимает в качестве параметра текущий каталог (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec(java.lang.String,%20java.lang.String[],%20java.io.File)

0 голосов
/ 27 января 2010

Эта Java-программа запущена вами или веб-сервером?

Потому что, если это последнее, вполне вероятно, что свойство user.home не имеет ожидаемого вами значения.

Кроме того, позиция (300, 300) и местоположение шрифта (/tmp/TITUSCBZ.TTF) отличаются от тех, что приведены в первом примере. Возможно, вам стоит перепроверить это.

...