Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1544|回复: 0

对im4java windows下使用问题的解决

  [复制链接]

该用户从未签到

发表于 2011-10-17 21:30:37 | 显示全部楼层 |阅读模式
如果直接使用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中去,而又尽量做到:

不改变im4java的代码;
在windows下和linux下通用;
便于部署。
最终考虑的是通过反射来实现这个功能,获取到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);
            }
        }
    }

}*注意 环境变量Path里面的imagemagic需要配置在系统环境变量前面 否则会调用windows的convert.exe
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 20:12 , Processed in 0.360241 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表