繁体   English   中英

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

[英]How to pass multiple image input-streams to im4java?

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

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

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

org.im4java.core.CommandException:转换:此图像格式没有解码委托`'@error/constitute.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);

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM