通过java命令使用image magick转换图像显示错误

通过java命令使用image magick转换图像显示错误,java,command-line,imagemagick,Java,Command Line,Imagemagick,我需要将所有的tif,jpeg,gif格式转换成jpg格式。为此,我使用 ProcessBuilder pb2 = new ProcessBuilder("convert.exe", "\"" +dest.toString()+ "\" ", "\" " + dest.getParent().toString().concat("/").concat(dest.getName().toString().substring(0, dest.getName().toString().

我需要将所有的tif,jpeg,gif格式转换成jpg格式。为此,我使用

        ProcessBuilder pb2 = new ProcessBuilder("convert.exe", "\"" +dest.toString()+ "\" ", "\" " + dest.getParent().toString().concat("/").concat(dest.getName().toString().substring(0, dest.getName().toString().lastIndexOf(".")).concat(".jpg"))+ "\" " );
        System.out.println("convert " + "\"" + dest.toString() + "\" " + "\" " + dest.getParent().toString().concat("/").concat(dest.getName().toString().substring(0, dest.getName().toString().lastIndexOf(".")).concat(".jpg")) + "\" " );
        pb2.redirectErrorStream(true);
        try {
            Process p2 = pb2.start();
            System.out.println("jpg done for " + dest.getName());
            new Thread(new InputConsumer(p2.getInputStream())).start();
            try {
                System.out.println("Exited with: " + p2.waitFor());
            } catch (InterruptedException ex) {
                Logger.getLogger(ImageFileCopy.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (IOException ex) {
            Logger.getLogger(ImageFileCopy.class.getName()).log(Level.SEVERE, null, ex);
        }
这是在说错误 “无效参数-和” 已退出:4“

我还尝试给出“C:\ProgramFiles\ImageMagick-6.8.6-Q16\convert.exe”。如果我使用全路径系统,不会显示错误,但会等待很长时间

我建议您使用java代码调用ImageMagick

它是开源的,有很多优点,并且易于使用

调用ImageMagick resize函数(例如)如下所示:

// create command
ConvertCmd cmd = new ConvertCmd();

// create the operation, add images and operators/options
IMOperation op = new IMOperation();
op.addImage("myimage.jpg");
op.resize(800,600);
op.addImage("myimage_small.jpg");

// execute the operation
cmd.run(op);

有关详细信息,请选中此简单项。

如果您使用的是
ProcessBuilder
,则无需“引用”参数,这就是使用
ProcessBuilder
的要点,它将保证每个单独的参数都作为参数传递给命令

ProcessBuilder pb2 = new ProcessBuilder(
    "convert.exe",
    dest.toString(), 
    dest.getParent().toString().concat("/").concat(dest.getName().toString().substring(0, dest.getName().toString().lastIndexOf(".")).concat(".jpg")));
我也同意Rafael的建议,一个包装器API将使生活变得更加轻松

[face palm]…Windows有自己的转换程序,可通过环境变量
路径访问该程序

即使当我使用
pb.directory
并将目录设置为ImageMagick的安装位置时,它仍然选择了Windows/MS程序

尝试将完整路径添加到
convert.exe

ProcessBuilder pb2 = new ProcessBuilder(
    "C:\\Program Files\\ImageMagick-6.8.6-Q16\\convert.exconvert.exe",
    dest.toString(), 
    dest.getParent().toString().concat("/").concat(dest.getName().toString().substring(0, dest.getName().toString().lastIndexOf(".")).concat(".jpg")));

感谢您指出了这一点……

如果我在运行时没有“引号”,那么当我使用ProcessBuilder pb2=new ProcessBuilder(Config.imagemagickrootpath+“/”+“convert”、“-density”、“100”、dest.toString()、“-background”、“white”、“-alpha”、“remove”、dest.toString()、dest.getParent().toString().concat(“/”)时,它也会说同样的错误.concat(dest.getName().toString().substring(0,dest.getName().toString().lastIndexOf(“.”).concat(“.jpg”));。系统正在创建两个映像-o,映像-1。我可以知道原因吗?您是否尝试过将“源”文件引用作为第一个选项(不要让imagemagic在我面前检查)重复是由于参数中调用了两次“dest.toString()”造成的。如何下载im4javajar@Dhinakar这是链接:只需下载源代码并将其包含到您的项目中。使用ConvertCmd类,如我的答案所示。在我的回答中,还有指向完整API和开发者指南的链接,让您可以根据自己的意愿自定义此示例。在java代码中,我们可以通过以下方式设置路径:String myPath=“C:\\Programs\\ImageMagick-6.3.9-Q16”;ProcessStarter.setGlobalSearchPath(myPath);