【问题标题】:Convert image using image magick via java command says error通过 java 命令使用 image magick 转换图像说错误
【发布时间】:2014-08-28 04:41:37
【问题描述】:

我需要将所有的 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:\Program Files\ImageMagick-6.8.6-Q16\convert.exe”。如果我使用完整路径系统不显示错误但等待很长时间。

请提出任何想法。

【问题讨论】:

    标签: java command-line imagemagick


    【解决方案1】:

    如果您使用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 将使生活变得更轻松......

    [掌心]...Windows 有自己的转换程序,可通过PATH 环境变量访问。

    即使我使用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")));
    

    感谢answer 指出...

    【讨论】:

    • 如果我在没有“报价”的情况下运行,也会出现同样的错误
    • 类似地当我使用 ProcessBuilder pb2 = new ProcessBuilder(Config.imagemagickrootpath + "/" + "convert", "-density", "100", dest.toString(),"-background", “白色”、“-alpha”、“删除”、dest.toString()、dest.getParent().toString().concat(“/”).concat(dest.getName().toString().substring( 0, dest.getName().toString().lastIndexOf(".")).concat(".jpg")));.系统正在创建两个图像-o,图像-1。请问是什么原因?
    • 您是否尝试过将“源”文件引用作为第一个选项(不要在我面前检查 imagemagic)
    • 重复是由于在参数中调用了两次“dest.toString()”。修复它。
    【解决方案2】:

    我建议使用im4java 从您的 java 代码中调用 ImageMagick。

    它是开源的,有API to call many ImageMagick functions 并且易于使用。

    ImageMagick 调整大小函数的调用(例如)如下所示:

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

    查看这个简单的developer's guide 了解更多信息。

    【讨论】:

    • 如何下载im4java jar
    • @Dhinakar 给你:im4java.sourceforge.net/#download 并且有链接:sourceforge.net/projects/im4java/files 只需下载源代码并将其包含到您的项目中。
    • 使用 ConvertCmd 类,如我的回答中所示。在我的回答中还有指向完整 API 和开发人员指南的链接,让您可以根据需要自定义此示例。
    • 在java代码中我们可以通过以下方式设置路径 String myPath="C:\\Programs\\ImageMagick-6.3.9-Q16"; ProcessStarter.setGlobalSearchPath(myPath);
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多