对im4java windows下使用问题的解决

如果直接使用im4java,在windows xp可能会出现问题,见使用im4java生成gif的缩略图。跟踪了一下im4java的源代码,未发现有针对linux的特殊设置。问题可能出在环境变量或者shell与windows命令行(cmd)之间的不同上。

直接测试了一下自己起进程运行imagemagick的convert命令:

public static void main(String[] args) { ProcessBuilder processBuilder = new ProcessBuilder("convert", "1.gif", "-resize", "64x64", "2.gif"); System.out.println(processBuilder.environment()); try { Process process = processBuilder.start(); process.waitFor(); System.out.println(process.exitValue()); InputStream stream = process.getErrorStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); for(String s=reader.readLine();s!=null;s=reader.readLine()){ System.out.println(s); } } catch (Exception e) { e.printStackTrace();

出现的问题和调用im4java的一样:

无效参数 – -resize

应该是进程调用了windows的转换分区命令convert.exe。而不是imagemagick的convert命令。

如果这样调用,则问题解决:

ProcessBuilder processBuilder = new ProcessBuilder(“cmd.exe”, “/C”,”convert”, “1.gif”,
        “-resize”, “64×64″, “2.gif”);

问题是怎么将这个代码增加到im4java中去,而又尽量做到:

  1. 不改变im4java的代码;
  2. 在windows下和linux下通用;
  3. 便于部署。

最终考虑的是通过反射来实现这个功能,获取到im4java的命令List,在List的头部增加两个字符串元素:cmd和/C。

然后封装成一个继承ConvertCmd的类,供程序调用:

import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import org.im4java.core.ConvertCmd; public class ForWinConvertCmd extends ConvertCmd { public ForWinConvertCmd() { super(); this.initForWin(); } public ForWinConvertCmd(boolean useGM) { super(useGM); this.initForWin(); } @SuppressWarnings("unchecked") protected void initForWin() { if (System.getProperty("os.name").startsWith("Windows")) { try { Field field = this.getClass().getSuperclass().getSuperclass() .getDeclaredField("iCommands"); field.setAccessible(true); List<String> value = (List<String>) field.get(this); value.addAll(0, Arrays.asList(new String[]{"cmd","/C"})); } catch (Exception e) { throw new RuntimeException(e); } } } }
PDF格式打印機    发送文章为PDF   

3 Comments to “对im4java windows下使用问题的解决”

  1. By 胖子, 2009年11月24日 @ 16:37

    我在vista机子上好使,在xp上头就不好使了..
    直接使用cmd /k 1.jpg -resize 2.jpg 时也无法调用到 imageMagic的convert

  2. By 胖子, 2009年11月24日 @ 17:21

    原来是版本问题..我用的是ImageMagick-6.5.6-Q16,他们机子上装的6.5.3就不好使了

  3. By Mark, 2010年12月1日 @ 16:34

    好使,救我一命。

这篇文章上的评论的 RSS feed TrackBack URI

Leave a Reply