imagemagick和grails中的问题

时间:2010-09-05 11:11:44

标签: macos grails imagemagick

我在图像魔法中有一个看起来很奇怪的新问题.. 我正在使用mac osx雪豹,我已经在它上面安装了图像magick并且它在命令上正常工作.. 但是当我从grails类中调用它时,就像下面的片段一样,它给了我 “无法运行程序”转换“:错误= 2,没有这样的文件或目录”

代码是: -

 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无法找到转换命令本身..这是一个os问题还是什么?

4 个答案:

答案 0 :(得分: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和其他一些无效。


我终于有了这个工作。这是我如何设置它。我希望这会有所帮助。

对我来说,修复的关键是我将'convert'包装成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)

此外,转换调用正在做一些相当复杂的事情,所以我添加了参数'-respect-parenthesis'(可能会或可能不会产生影响)。

我不确定需要多少环境变量设置,因为我在黑暗中刺了一会儿,但因为这只适用于我的开发盒......

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你可能想尝试一个属于grails生态系统的图像插件

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

应用程序在服务器中运行时的grails路径可能与从命令行运行java

不同

答案 3 :(得分:0)

我这样做:

将“convert”文件放入/ 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

它有效,但不要忘记将文件“转换”到您的位置并将其用于此位置。