【问题标题】:problem in imagemagick and grailsimagemagick 和 grails 中的问题
【发布时间】:2010-09-05 11:11:43
【问题描述】:

我在图像魔法中遇到了一个看起来很奇怪的新问题.. 我正在使用 mac osx 雪豹,我已经在它上面安装了 image magick,它在命令上工作正常.. 但是当我像下面的 sn-p 从 grails 类中调用它时,它给了我 "无法运行程序 "convert": error=2, No such file or directory"

代码是:-

 public static boolean resizeImage(String srcPath, String destPath,String size) {

    ArrayList<String> command = new ArrayList<String>(10);


    command.add("convert");
    command.add("-geometry");
    command.add(size);
    command.add("-quality");
    command.add("100" );
    command.add(srcPath);
    command.add(destPath);

    System.out.println(command);

    return exec((String[])command.toArray(new String[1]));
}

private static boolean exec(String[] command) {
    Process proc;

    try {
        //System.out.println("Trying to execute command " + Arrays.asList(command));
        proc = Runtime.getRuntime().exec(command);
    } catch (IOException e) {
        System.out.println("IOException while trying to execute " );
        for(int i =0 ; i<command.length; i++) {
        System.out.println(command[i]);
        }
        return false;
    }

    //System.out.println("Got process object, waiting to return.");

    int exitStatus;

    while (true) {
        try {
            exitStatus = proc.waitFor();
            break;
        } catch (java.lang.InterruptedException e) {
            System.out.println("Interrupted: Ignoring and waiting");
        }
    }
    if (exitStatus != 0) {
        System.out.println("Error executing command: " + exitStatus);
    }
    return (exitStatus == 0);
}

我已经尝试过像 ls 这样的普通命令,没关系,所以问题是 grails 无法找到转换命令本身.. 是操作系统问题还是什么?

【问题讨论】:

    标签: macos grails imagemagick


    【解决方案1】:

    (答案见下方)

    我也遇到了同样的问题。这个问题似乎与 Mac OS X 相关,因为我们有几个 Linux 实例运行没有错误。该错误类似于以下内容:

    java.io.IOException:无法运行程序“/usr/bin/ImageMagick-6.7.3/bin/convert /a/temp/in/tmpPic3143119797006817740.png /a/temp/out/100000726.png”:错误=2, 没有那个文件或目录

    所有文件都在那里,并且在 chmod 777 目录中 - 正如您所指出的,从 shell 运行确切的命令可以正常工作。

    此时我的理论是 imagemgick 不能加载某种库本身,并且“没有这样的文件”是指 dylib 或类似的东西。

    我尝试设置 LD_LIBRARY_PATH 和其他一些无济于事。


    我终于得到了这个工作。这是我的设置方式。我希望这会有所帮助。

    对我来说,修复的关键是我将“转换”封装到一个 shell 脚本中,设置了一堆环境变量,然后调用那个 shell 脚本而不是直接转换:

    (convertWrapper.sh)

    export MAGICK_HOME=/usr/local/ImageMagick-6.7.5
    export MAGICK_CONFIGURE_PATH=${MAGICK_HOME}/etc/ImageMagick:${MAGICK_HOME}/share/doc/ImageMagick/www/source
    
    export PATH=${PATH}:${MAGICK_HOME}/bin
    export LD_LIBRARY_PATH=${MAGICK_HOME}/lib:${LD_LIBRARY_PATH}
    export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${MAGICK_HOME}/lib
    export MAGICK_TMPDIR=/private/tmp
    
    echo "$@" >> /private/tmp/m.log 2>&1
    /usr/local/ImageMagick-6.7.5/bin/convert -verbose "$@" >> /private/tmp/m.log 2>&1
    

    (convertWrapper.sh)

    另外,convert 调用做了一些相当复杂的事情,所以我添加了参数“-respect-parenthesis”(它可能有效果,也可能没有效果)。

    我不确定需要多少环境变量设置,因为我在黑暗中刺了一段时间,但因为这仅适用于我的开发框......

    【讨论】:

      【解决方案2】:

      当您从 Java 运行命令时,您需要确定 PATH 的设置。它必须与从终端运行时的不同。

      您是否以其他用户身份运行 Grails(通过 Tomcat?)?它可能与您的普通用户有不同的路径。

      【讨论】:

      • 我正在使用 netbeans,所以我想它正在使用码头.. 那我该怎么办
      【解决方案3】:

      您可能想尝试作为 grails 生态系统一部分的图像插件之一

      http://www.grails.org/ImageTools+plugin

      应用在服务器上运行时的grails路径可能与从命令行运行java不同

      【讨论】:

      • 我试过了,这就是为什么我需要 image magick.. 质量不太好,选项也不像 image magick
      • 我发现了同样的问题,所以我只是利用底层的 jai 库并创建了自己的服务
      • 这可能会解决您的一些问题sourceforge.net/projects/jmagick
      • jmagick 是一个非常奇怪的包装器.. 我只是找不到可以帮助我在我的 mac 上的 grails 项目中正确安装它的教程
      【解决方案4】:

      我这样做:

      把“转换”文件放到/usr/bin

      然后添加到 Config.groovy:

      gk {
          imageMagickPath = "/usr/bin/convert"
      }
      

      然后在我的 ImageService.groovy 中:

      import org.springframework.web.context.request.RequestContextHolder as RCH
      

      [..]

      def grailsApplication = RCH.requestAttributes.servletContext.grailsApplication
      def imPath = grailsApplication.config.gk.imageMagickPath
      def command = imPath + " some_properties"
      def proc = Runtime.getRuntime().exec(command)
      

      这样你就可以得到如下命令:/usr/bin/convert some_properties

      它可以工作,但不要忘记将文件“转换”到您的位置并将其与该位置一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        相关资源
        最近更新 更多