1 /*** 2 * Copyright (C) 2009 TM-Search Community. 3 * 4 * This file is part of TM-Search Services. 5 * 6 * Foobar is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * Foobar is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with Foobar. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package eu.europa.tmsearch.services.business.util; 21 22 import java.awt.Dimension; 23 import java.awt.Point; 24 import java.awt.Transparency; 25 import java.awt.color.ColorSpace; 26 import java.awt.image.BufferedImage; 27 import java.awt.image.ColorModel; 28 import java.awt.image.ComponentColorModel; 29 import java.awt.image.DataBuffer; 30 import java.awt.image.DataBufferByte; 31 import java.awt.image.PixelInterleavedSampleModel; 32 import java.awt.image.Raster; 33 import java.awt.image.WritableRaster; 34 35 import magick.ImageInfo; 36 import magick.MagickException; 37 import magick.MagickImage; 38 39 import org.apache.log4j.Logger; 40 41 import eu.europa.tmsearch.services.business.exception.BusinessServiceException; 42 import eu.europa.tmsearch.services.business.exception.ImageProcessorRuntimeException; 43 import eu.europa.tmsearch.services.model.TradeMarkImage; 44 45 /*** 46 * An ImageProcessor implementation using JMagick for manipulating images. 47 * Requires native ImageMagick and JMagick libraries to be installed on the 48 * platform 49 * 50 * 51 */ 52 public class JMagickImageProcessorImpl implements ImageProcessor { 53 54 private static Logger log = Logger.getLogger(JMagickImageProcessorImpl.class); 55 56 /*** 57 * Echoes java.library.path to debug log 58 */ 59 public JMagickImageProcessorImpl() { 60 if (log.isDebugEnabled()) { 61 String javaLibraryPath = System.getProperty("java.library.path"); 62 log.debug("Environment variable java.library.path points to '" + javaLibraryPath + "'"); 63 } 64 } 65 66 /*** 67 * Generates a thumbnail trade mark image from a master's TradeMark image. 68 * 69 * @param tradeMarkImage 70 * Master trademark image 71 * @param height 72 * Desired height. If 0 thumbnail height is calculated to 73 * preserve master image's aspect ratio. 74 * @param width 75 * Desired width 76 * @return A TradeMarkImage containing the thumbnail 77 * @throws ImageProcessorRuntimeException 78 * if native ImageMagick and JMagick libraries are not installed 79 * or properly configured in the running platform 80 */ 81 public TradeMarkImage getThumbnailImage(TradeMarkImage tradeMarkImage, int height, int width) 82 throws ImageProcessorRuntimeException { 83 TradeMarkImage trademarkThumbnailImage = new TradeMarkImage(); 84 try { 85 86 ImageInfo info = new ImageInfo(); 87 MagickImage blobImage = new MagickImage(info, tradeMarkImage.getImageData()); 88 height = (height > 0) ? height : (width * blobImage.getDimension().height / blobImage 89 .getDimension().width); 90 log.debug("buffer size: " + tradeMarkImage.getImageData().length + " HxW: " + height + "x" 91 + width); 92 MagickImage scaled = blobImage.zoomImage(width, height); 93 trademarkThumbnailImage.setImageData(scaled.imageToBlob(info)); 94 blobImage.destroyImages(); 95 } catch (MagickException me) { 96 log.error("Caught MagickException while converting image", me); 97 throw new BusinessServiceException(); 98 } catch (UnsatisfiedLinkError ule) { 99 log.error("Unable to find required native library in 'java.library.path'. Details: " 100 + ule.getMessage()); 101 throw new ImageProcessorRuntimeException(ule); 102 } catch (NoClassDefFoundError ncdfe) { 103 log 104 .error("Unable to find required class for manipulating images. Details: " 105 + ncdfe.getMessage()); 106 log.error("Complete info: ", ncdfe); 107 throw new ImageProcessorRuntimeException(ncdfe); 108 } 109 return trademarkThumbnailImage; 110 } 111 112 public TradeMarkImage getImage(TradeMarkImage tradeMarkImage) { 113 throw new UnsupportedOperationException(); 114 } 115 }