如何将多个图像输入流传递给im4java?

时间:2014-08-06 17:20:47

标签: java imagemagick im4java

我正在使用imagemagick构建一个具有多个图层的PSD。这对我来说使用CLI命令convert 1.png 1.png 2.png test.psd。 (额外的1.png是因为PSD的第一层是所有层的展平结果)

我想使用im4java,而不是实际将图像保存到磁盘(使用InputStream)。使用InputStream初始化的输入Pipe应该可以实现。但是,它仅适用于一个输入图像。如果我有几个,我不知道如何将它们全部作为过程的输入传递给对象'标准输入。

我尝试使用java.io.SequenceInputStream连接我的图像输入流,但这会导致错误:

  

org.im4java.core.CommandException:convert:此图像格式没有解码委托`' @ error / construct.c / ReadImage / 501。

我的代码:

FileInputStream imageStream1 = new FileInputStream("1.png");
FileInputStream imageStream2 = new FileInputStream("2.png");
InputStream concatStreams = new SequenceInputStream(imageStream1, imageStream2);

IMOperation op = new IMOperation();
// "-" means to read the image from stdin
op.addImage("-"); // the first, "dummy" image
op.addImage("-"); // 1.png
op.addImage("-"); // 2.png

// output in PSD format to stdout
op.addImage("psd:-");

ConvertCmd cmd = new ConvertCmd();

Pipe pipeIn = new Pipe(concatStreams, null);
cmd.setInputProvider(pipeIn);

// omitted cmd.setOutputConsumer code

cmd.run(op);

1 个答案:

答案 0 :(得分:0)

我知道这是一个非常古老的问题,但我最终来自谷歌搜索,所以我认为值得回答。

我通过将输入加载为java.awt.image.BufferedImage而不是stream来解决它。

BufferedImage image1 = ImageIO.read("1.png");
BufferedImage image2 = ImageIO.read("2.png");

IMOperation op = new IMOperation();
// No argument means to use images given in cmd.run. 
// These can be either BufferedImage instances or Strings with the path to files.
op.addImage(); // the first, "dummy" image
op.addImage(); // 1.png
op.addImage(); // 2.png

// output in PSD format to stdout
op.addImage("psd:-");

ConvertCmd cmd = new ConvertCmd();

// omitted cmd.setOutputConsumer code

cmd.run(op, image1, image1, image2);
// for files directly: 
// cmd.run(op, "1.png", "1.png", "2.png");

请注意,输出仍可以通过管道传输到您想要的任何内容。