Я использую im4java версию 1.4.0 для доступа к функциям ImageMagick от Java. Он отлично работает для обработки изображений в и из файлов.Как получить im4java, работающий с BufferedImage
У Developers Guide есть раздел по использованию Буферизованных изображений вместо записи вывода в файл, и есть тест (TestCase13), демонстрирующий использование буферизованных изображений в качестве вывода. Однако, когда я запускаю какое-либо действие с помощью Буферизованного изображения, я получаю сообщение org.im4java.core.CommandException
: no ImageReader for given format
.
Я пробовал несколько разных вещей (включая добавление jai_imageio.jar
для предоставления дополнительных форматов), но ничего не работает. Основной тест-кода, который показывает эту проблему (на основе TestCase13 im4java.jar), составляет:
@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.access$200(ProcessStarter.java:54)
at org.im4java.process.ProcessStarter$2.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), но не нашел это хорошим решением по другим причинам.
Заранее благодарим за любую помощь или идеи.