【问题标题】:im4java Convert Crashes on Piped Input/Outputim4java 在管道输入/输出上转换崩溃
【发布时间】:2019-08-21 11:28:02
【问题描述】:

我正在使用 im4java 来转换图像。以下程序因堆栈跟踪而崩溃:Caused by: org.im4java.core.CommandException: convert: insufficient image data in file /tmp/magick-254901G7YJ9qaMQv5' @ error/jpeg.c/ReadJPEGImage/1154.

看起来它正在生成一个临时文件。直接在 ImageMagick 命令行上运行相同的命令可以得到正确的结果。

我正在运行 ImageMagick-6.9.10-61im4java 1.4.0

我想知道是否有人有任何见解。

IMOperation op = new IMOperation();
op.addImage("-");
op.addImage("jpg:-");
op.quality(0.85);

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    // image is of type MultipartFile
    Pipe pipeIn = new Pipe(image.getInputStream(), null);
    Pipe pipeOut = new Pipe(null, outputStream);

    convertCmd.setInputProvider(pipeIn);
    convertCmd.setOutputConsumer(pipeOut);
    convertCmd.run(op);

    return outputStream.toByteArray();
} catch (Exception e) {
           //
}

【问题讨论】:

  • 您是否尝试过自己创建临时文件?只是为了检查它是管道还是其他东西。
  • @Thomas 我该怎么做?每次创建的临时文件都不一样。我可以配置要使用的文件吗?

标签: java imagemagick


【解决方案1】:

我查看了一些旧代码,其中我们做了类似的事情,我意识到您的问题是使用 2 个管道,其中一个具有空目标,另一个具有空源。这可能会导致临时文件被使用。

您需要使用一个管道,而不是这样做:

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
  Pipe pipe = new Pipe(image.getInputStream(), outputStream);

  convertCmd.setInputProvider( pipe );
  convertCmd.setOutputConsumer( pipe );

  return outputStream.toByteArray();
}

来自JavaDoc

您可以对流程管道的两端使用相同的管道对象。

【讨论】:

  • 不走运。仍然得到同样的错误。实际上代码来自管道部分下的im4java.sourceforge.net/docs/dev-guide.html。所以我认为代码是正确的。可能是配置问题?
  • @JFreebird 可能就是这种情况。您确定您使用的 IM 安装、映像和参数与命令行上的相同吗?
  • 是的,完全一样。我意识到我在运行转换之前调用了Info(),如果我不调用Info() 并使用文件系统文件作为输入/输出(而不是管道),那么问题就消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多