extensions/net.sf.basedb.thumbnails/trunk/src/net/sf/basedb/thumbnails/impl/NdpiImageLoader.java

Code
Comments
Other
Rev Date Author Line
6045 11 Nov 20 nicklas 1 package net.sf.basedb.thumbnails.impl;
6045 11 Nov 20 nicklas 2
6045 11 Nov 20 nicklas 3 import java.awt.image.BufferedImage;
6045 11 Nov 20 nicklas 4 import java.io.IOException;
6045 11 Nov 20 nicklas 5 import java.io.InputStream;
6045 11 Nov 20 nicklas 6 import java.util.Iterator;
6045 11 Nov 20 nicklas 7
6045 11 Nov 20 nicklas 8 import javax.imageio.ImageIO;
6045 11 Nov 20 nicklas 9 import javax.imageio.ImageReader;
6045 11 Nov 20 nicklas 10 import javax.imageio.stream.ImageInputStream;
6045 11 Nov 20 nicklas 11
6045 11 Nov 20 nicklas 12 import org.imgscalr.Scalr;
6045 11 Nov 20 nicklas 13 import org.imgscalr.Scalr.Rotation;
6045 11 Nov 20 nicklas 14
6053 13 Nov 20 nicklas 15 import net.sf.basedb.thumbnails.Crop;
6045 11 Nov 20 nicklas 16 import net.sf.basedb.thumbnails.ImageLoader;
6045 11 Nov 20 nicklas 17 import net.sf.basedb.thumbnails.ThumbnailSize;
6045 11 Nov 20 nicklas 18 import net.sf.basedb.thumbnails.Thumbnails;
6045 11 Nov 20 nicklas 19
6045 11 Nov 20 nicklas 20 /**
6045 11 Nov 20 nicklas 21   Image loader that expect an image file that can be read
6045 11 Nov 20 nicklas 22   by the {@link ImageIO} implementation. Typically used for
6045 11 Nov 20 nicklas 23   PNG and JPG images. Thumbnails are scaled and returned as
6045 11 Nov 20 nicklas 24   JPG images.
6045 11 Nov 20 nicklas 25
6045 11 Nov 20 nicklas 26   @author nicklas
6045 11 Nov 20 nicklas 27   @since 1.0
6045 11 Nov 20 nicklas 28 */
6045 11 Nov 20 nicklas 29 public class NdpiImageLoader 
6045 11 Nov 20 nicklas 30   implements ImageLoader
6045 11 Nov 20 nicklas 31 {
6045 11 Nov 20 nicklas 32   private BufferedImage image;
6045 11 Nov 20 nicklas 33   
6045 11 Nov 20 nicklas 34   public NdpiImageLoader() 
6045 11 Nov 20 nicklas 35   {}
6045 11 Nov 20 nicklas 36
6045 11 Nov 20 nicklas 37   @Override
6045 11 Nov 20 nicklas 38   public String getThumbMimeType()
6045 11 Nov 20 nicklas 39   {
6045 11 Nov 20 nicklas 40     return "image/jpg";
6045 11 Nov 20 nicklas 41   }
6045 11 Nov 20 nicklas 42   
6045 11 Nov 20 nicklas 43   @Override
6045 11 Nov 20 nicklas 44   public String getThumbExtension()
6045 11 Nov 20 nicklas 45   {
6045 11 Nov 20 nicklas 46     return "jpg";
6045 11 Nov 20 nicklas 47   }
6045 11 Nov 20 nicklas 48   
6045 11 Nov 20 nicklas 49   @Override
6046 11 Nov 20 nicklas 50   public void loadImage(InputStream in, int imageIndex)
6045 11 Nov 20 nicklas 51     throws IOException 
6045 11 Nov 20 nicklas 52   {
6045 11 Nov 20 nicklas 53     ImageInputStream iin = null;
6045 11 Nov 20 nicklas 54     ImageReader reader = null;
6045 11 Nov 20 nicklas 55     try
6045 11 Nov 20 nicklas 56     {
6045 11 Nov 20 nicklas 57       iin = ImageIO.createImageInputStream(in);
6045 11 Nov 20 nicklas 58       Iterator<ImageReader> it = ImageIO.getImageReaders(iin);
6045 11 Nov 20 nicklas 59       if (it == null || !it.hasNext()) return;
6045 11 Nov 20 nicklas 60       
6045 11 Nov 20 nicklas 61       // We are just looking for the first reader compatible:
6045 11 Nov 20 nicklas 62       reader = it.next();
6045 11 Nov 20 nicklas 63       reader.setInput(iin);
6045 11 Nov 20 nicklas 64       int numImages = reader.getNumImages(true);
6053 13 Nov 20 nicklas 65       
6053 13 Nov 20 nicklas 66       boolean crop = imageIndex > 100;
6053 13 Nov 20 nicklas 67       if (crop) imageIndex -= 100;
6053 13 Nov 20 nicklas 68       
6046 11 Nov 20 nicklas 69       if (imageIndex < 0)
6045 11 Nov 20 nicklas 70       {
6046 11 Nov 20 nicklas 71         // In the NDPI images that we have the first image has the highest resolution
6046 11 Nov 20 nicklas 72         // The following 6 images are lower-resolution version 
6046 11 Nov 20 nicklas 73         // Then there is a full-slide image and some kind of mask image
6046 11 Nov 20 nicklas 74         // We select the smallest image that have the same aspect ratio and image type as the first image
6046 11 Nov 20 nicklas 75         float aspectRatio = reader.getAspectRatio(0);
6046 11 Nov 20 nicklas 76         int width = reader.getWidth(0);
6046 11 Nov 20 nicklas 77         int imageType = reader.getRawImageType(0).getBufferedImageType();
6046 11 Nov 20 nicklas 78         imageIndex = 0;
6046 11 Nov 20 nicklas 79         for (int index = 1; index < numImages; index++)
6046 11 Nov 20 nicklas 80         {
6046 11 Nov 20 nicklas 81           if (Math.abs(aspectRatio-reader.getAspectRatio(index)) < 0.001 
6046 11 Nov 20 nicklas 82             && imageType == reader.getRawImageType(0).getBufferedImageType()
6046 11 Nov 20 nicklas 83             && width > reader.getWidth(index))
6046 11 Nov 20 nicklas 84           {
6046 11 Nov 20 nicklas 85             width = reader.getWidth(index);
6046 11 Nov 20 nicklas 86             imageIndex = index;
6046 11 Nov 20 nicklas 87           }
6046 11 Nov 20 nicklas 88         }
6045 11 Nov 20 nicklas 89       }
6046 11 Nov 20 nicklas 90       else if (imageIndex >= numImages)
6046 11 Nov 20 nicklas 91       {
6046 11 Nov 20 nicklas 92         imageIndex = numImages-1;
6046 11 Nov 20 nicklas 93       }
6046 11 Nov 20 nicklas 94       image = reader.read(imageIndex);
6053 13 Nov 20 nicklas 95       
6045 11 Nov 20 nicklas 96     }
6045 11 Nov 20 nicklas 97     catch (RuntimeException ex)
6045 11 Nov 20 nicklas 98     {
6045 11 Nov 20 nicklas 99       ex.printStackTrace(System.out);
6045 11 Nov 20 nicklas 100       throw ex;
6045 11 Nov 20 nicklas 101     }
6045 11 Nov 20 nicklas 102     finally
6045 11 Nov 20 nicklas 103     {
6045 11 Nov 20 nicklas 104       if (reader != null) reader.dispose();
6045 11 Nov 20 nicklas 105       if (iin != null) iin.close();
6045 11 Nov 20 nicklas 106     }
6045 11 Nov 20 nicklas 107   }
6045 11 Nov 20 nicklas 108
6045 11 Nov 20 nicklas 109   @Override
6053 13 Nov 20 nicklas 110   public byte[] getThumbImage(ThumbnailSize size, Rotation rotation, Crop crop) 
6045 11 Nov 20 nicklas 111     throws IOException
6045 11 Nov 20 nicklas 112   {
6053 13 Nov 20 nicklas 113     BufferedImage tmp = crop == null ? image : crop.crop(image); 
6053 13 Nov 20 nicklas 114     BufferedImage thumb = Thumbnails.scaleImage(tmp, size);
6045 11 Nov 20 nicklas 115     if (rotation != null) thumb = Scalr.rotate(thumb, rotation);
6045 11 Nov 20 nicklas 116     byte[] jpg = Thumbnails.toJpg(thumb, size.MEMORY);
6045 11 Nov 20 nicklas 117     return jpg;
6045 11 Nov 20 nicklas 118   }
6045 11 Nov 20 nicklas 119
6045 11 Nov 20 nicklas 120 }