/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: JMagickLoader.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.cmf.loader.image; import com.uwyn.rife.cmf.dam.exceptions.ContentManagerException; import com.uwyn.rife.cmf.loader.ImageContentLoaderBackend; import com.uwyn.rife.config.RifeConfig; import com.uwyn.rife.tools.ExceptionUtils; import com.uwyn.rife.tools.FileUtils; import com.uwyn.rife.tools.ImageWaiter; import java.awt.Image; import java.awt.Toolkit; import java.io.File; import java.util.Set; import magick.ImageInfo; import magick.MagickImage; import magick.MagickProducer; /** * This is an image loader back-end that uses JMagick to load image files, if its * classes are present in the classpath. * <p>More information about JMagick can be obtained from <a * href="http://www.yeo.id.au/jmagick">http://www.yeo.id.au/jmagick</a>. * * @author Geert Bevin (gbevin[remove] at uwyn dot com) * @version $Revision: 3918 $ * @since 1.0 */ public class JMagickLoader extends ImageContentLoaderBackend { public Image loadFromBytes(byte[] data, Set<String> errors) throws ContentManagerException { return new LoaderDelegate().load(data, errors); } public boolean isBackendPresent() { try { return null != Class.forName("magick.ImageInfo"); } catch (Throwable e) { return false; } } private static class LoaderDelegate { public Image load(byte[] data, Set<String> errors) throws ContentManagerException { Image image = null; File tmp_file = null; try { tmp_file = File.createTempFile("cmfjmagick", "", new File(RifeConfig.Global.getTempPath())); FileUtils.writeBytes(data, tmp_file); ImageInfo image_info = new ImageInfo(tmp_file.getAbsolutePath()); MagickImage magick = new MagickImage(); magick.readImage(image_info); // if it's an unsupported JMagick image, return null if (0 == magick.getMagick().length()) { return null; } // create an awt image from it and wait 'till it's fully loaded MagickProducer producer = new MagickProducer(magick); image = Toolkit.getDefaultToolkit().createImage(producer); ImageWaiter.wait(image); } catch (Throwable e) { if (errors != null) { errors.add(ExceptionUtils.getExceptionStackTrace(e)); } image = null; } finally { if (tmp_file != null) { tmp_file.delete(); } } return image; } } }