[英]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.