如何让 im4java 与 BufferedImage 一起工作
How to get im4java working with BufferedImage
我正在使用 Java 的 im4java version 1.4.0 to access ImageMagick 功能。它可以很好地处理与文件之间的图像。
Developers Guide 有一个部分介绍了使用缓冲图像而不是将输出写入文件,并且有一个测试 (TestCase13) 演示了使用缓冲图像作为输出。但是,当我 运行 对缓冲图像执行任何操作时,我收到 org.im4java.core.CommandException
说明:no ImageReader for given format
.
我尝试了很多不同的方法(包括添加 jai_imageio.jar
以提供其他格式),但似乎没有任何效果。显示问题的基本测试代码(基于 im4java.jar 的 TestCase13)是:
@Test
public void shouldWorkWithBufferedImageTest() throws InterruptedException, IOException, IM4JavaException {
ProcessStarter.setGlobalSearchPath("C:\Program Files\ImageMagick-6.8.9-Q8");
String iImageDir = "C:\images";
String var1 = "png";
IMOperation imOp = new IMOperation();
imOp.addImage(new String[]{iImageDir + "sample-image=6.png"});
imOp.blur(Double.valueOf(2.0D)).paint(Double.valueOf(10.0D));
imOp.addImage(new String[]{var1 + ":-"});
ConvertCmd convertCmd = new ConvertCmd();
Stream2BufferedImage stream2BufferedImage = new Stream2BufferedImage();
convertCmd.setOutputConsumer(stream2BufferedImage);
convertCmd.run(imOp, new Object[0]);
BufferedImage outImage = stream2BufferedImage.getImage();
ImageIO.write(outImage, "PNG", new File(iImageDir + "tmpfile.png"));
DisplayCmd.show(iImageDir + "tmpfile.png");
}
运行 这会引发以下错误:
org.im4java.core.CommandException: java.lang.IllegalStateException: no ImageReader for given format
at org.im4java.core.ImageCommand.run(ImageCommand.java:219)
at test.groovy.services.ImageManipulation.JavaBufferedImageManipulationTest.shouldWorkBufferedImageTest(JavaBufferedImageManipulationTest.java:31)
Caused by: java.lang.IllegalStateException: no ImageReader for given format
at org.im4java.core.Stream2BufferedImage.consumeOutput(Stream2BufferedImage.java:82)
at org.im4java.process.ProcessStarter.processOutput(ProcessStarter.java:276)
at org.im4java.process.ProcessStarter.access0(ProcessStarter.java:54)
at org.im4java.process.ProcessStarter.call(ProcessStarter.java:433)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.lang.Thread.run(Thread.java:745)
错误发生在 convertCmd.run
行,但是,问题似乎出在将 outputConsumer 设置为 stream2BufferedImage。我该如何解决? im4java 和 BufferedImages 是否存在已知错误?有没有比导出到临时文件然后将其读回 BufferedImage 更好的解决方法?我知道 JMagick(作为 im4java 的替代品)但由于其他原因没有找到一个好的解决方案。
提前感谢您提供任何帮助或想法。
在这个例子中看到我将输入源作为缓冲图像,输出也作为缓冲图像。希望对您有所帮助。
public static void main(String... args) throws Exception {
IMOperation op = new IMOperation();
op.addImage();
op.resize(350)
op.addImage("png:-")
BufferedImage images = ImageIO.read(new File("image.jpg"));
// set up command
ConvertCmd convert = new ConvertCmd();
Stream2BufferedImage s2b = new Stream2BufferedImage();
convert.setOutputConsumer(s2b);
// run command and extract BufferedImage from OutputConsumer
convert.run(op,images);
BufferedImage img = s2b.getImage();
}
我正在使用 Java 的 im4java version 1.4.0 to access ImageMagick 功能。它可以很好地处理与文件之间的图像。
Developers Guide 有一个部分介绍了使用缓冲图像而不是将输出写入文件,并且有一个测试 (TestCase13) 演示了使用缓冲图像作为输出。但是,当我 运行 对缓冲图像执行任何操作时,我收到 org.im4java.core.CommandException
说明:no ImageReader for given format
.
我尝试了很多不同的方法(包括添加 jai_imageio.jar
以提供其他格式),但似乎没有任何效果。显示问题的基本测试代码(基于 im4java.jar 的 TestCase13)是:
@Test
public void shouldWorkWithBufferedImageTest() throws InterruptedException, IOException, IM4JavaException {
ProcessStarter.setGlobalSearchPath("C:\Program Files\ImageMagick-6.8.9-Q8");
String iImageDir = "C:\images";
String var1 = "png";
IMOperation imOp = new IMOperation();
imOp.addImage(new String[]{iImageDir + "sample-image=6.png"});
imOp.blur(Double.valueOf(2.0D)).paint(Double.valueOf(10.0D));
imOp.addImage(new String[]{var1 + ":-"});
ConvertCmd convertCmd = new ConvertCmd();
Stream2BufferedImage stream2BufferedImage = new Stream2BufferedImage();
convertCmd.setOutputConsumer(stream2BufferedImage);
convertCmd.run(imOp, new Object[0]);
BufferedImage outImage = stream2BufferedImage.getImage();
ImageIO.write(outImage, "PNG", new File(iImageDir + "tmpfile.png"));
DisplayCmd.show(iImageDir + "tmpfile.png");
}
运行 这会引发以下错误:
org.im4java.core.CommandException: java.lang.IllegalStateException: no ImageReader for given format
at org.im4java.core.ImageCommand.run(ImageCommand.java:219)
at test.groovy.services.ImageManipulation.JavaBufferedImageManipulationTest.shouldWorkBufferedImageTest(JavaBufferedImageManipulationTest.java:31)
Caused by: java.lang.IllegalStateException: no ImageReader for given format
at org.im4java.core.Stream2BufferedImage.consumeOutput(Stream2BufferedImage.java:82)
at org.im4java.process.ProcessStarter.processOutput(ProcessStarter.java:276)
at org.im4java.process.ProcessStarter.access0(ProcessStarter.java:54)
at org.im4java.process.ProcessStarter.call(ProcessStarter.java:433)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.lang.Thread.run(Thread.java:745)
错误发生在 convertCmd.run
行,但是,问题似乎出在将 outputConsumer 设置为 stream2BufferedImage。我该如何解决? im4java 和 BufferedImages 是否存在已知错误?有没有比导出到临时文件然后将其读回 BufferedImage 更好的解决方法?我知道 JMagick(作为 im4java 的替代品)但由于其他原因没有找到一个好的解决方案。
提前感谢您提供任何帮助或想法。
在这个例子中看到我将输入源作为缓冲图像,输出也作为缓冲图像。希望对您有所帮助。
public static void main(String... args) throws Exception {
IMOperation op = new IMOperation();
op.addImage();
op.resize(350)
op.addImage("png:-")
BufferedImage images = ImageIO.read(new File("image.jpg"));
// set up command
ConvertCmd convert = new ConvertCmd();
Stream2BufferedImage s2b = new Stream2BufferedImage();
convert.setOutputConsumer(s2b);
// run command and extract BufferedImage from OutputConsumer
convert.run(op,images);
BufferedImage img = s2b.getImage();
}