diff servlet/src/digilib/image/ImageLoaderDocuImage.java @ 569:1f666c2b4578

Merge with PDF branch 8beefd1142b28ca9b2433205e7eea82a517bb215
author robcast
date Tue, 21 Dec 2010 09:52:16 +0100
parents 8beefd1142b2
children 50f291d808b1 fd2ef7e46119
line wrap: on
line diff
--- a/servlet/src/digilib/image/ImageLoaderDocuImage.java	Wed Jul 14 16:36:42 2010 +0200
+++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java	Tue Dec 21 09:52:16 2010 +0100
@@ -52,7 +52,7 @@
 import digilib.io.ImageFileset;
 
 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */
-public class ImageLoaderDocuImage extends DocuImageImpl {
+public class ImageLoaderDocuImage extends ImageInfoDocuImage {
 
 	/** image object */
 	protected BufferedImage img;
@@ -117,20 +117,21 @@
 	}
 
 	/* returns a list of supported image formats */
-	public Iterator getSupportedFormats() {
+	public Iterator<String> getSupportedFormats() {
 		String[] formats = ImageIO.getReaderFormatNames();
 		return Arrays.asList(formats).iterator();
 	}
 
     /** Check image size and type and store in ImageFile f */
-    public boolean identify(ImageFile imgf) throws IOException {
+    public ImageFile identify(ImageFile imageFile) throws IOException {
         // try parent method first
-        if (super.identify(imgf)) {
-            return true;
+        ImageFile imf = super.identify(imageFile);
+        if (imf != null) {
+            return imf;
         }
         // fileset to store the information
-        ImageFileset imgfs = imgf.getParent();
-        File f = imgf.getFile();
+        ImageFileset imgfs = imageFile.getParent();
+        File f = imageFile.getFile();
         if (f == null) {
             throw new IOException("File not found!");
         }
@@ -138,47 +139,27 @@
         /*
          * try ImageReader
          */
-        RandomAccessFile raf = new RandomAccessFile(f, "r");
-        ImageInputStream istream = ImageIO.createImageInputStream(raf);
-        Iterator readers = ImageIO.getImageReaders(istream);
-        if (readers.hasNext()) {
-            ImageReader reader = (ImageReader) readers.next();
-            /* are there more readers? */
-            logger.debug("ImageIO: this reader: " + reader.getClass());
-            while (readers.hasNext()) {
-                logger.debug("ImageIO: next reader: "
-                        + readers.next().getClass());
-            }
-            try {
-                reader.setInput(istream);
-                ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0));
-                imgf.setSize(d);
-                //String t = reader.getFormatName();
-                String t = FileOps.mimeForFile(f);
-                imgf.setMimetype(t);
-                //logger.debug("  format:"+t);
-                if (imgfs != null) {
-                    imgfs.setAspect(d);
-                }
-                return true;
-            } finally {
-                // dispose the reader to free resources
-                reader.dispose();
-                raf.close();
-            }
+        if ((reader == null) || (imgFile != imageFile.getFile())) {
+            getReader(imageFile);
         }
-        throw new FileOpException("ERROR: unknown image file format!");
+        ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0));
+        imageFile.setSize(d);
+        // String t = reader.getFormatName();
+        String t = FileOps.mimeForFile(f);
+        imageFile.setMimetype(t);
+        // logger.debug("  format:"+t);
+        if (imgfs != null) {
+            imgfs.setAspect(d);
+        }
+        return imageFile;
     }
-
     
     /* load image file */
 	public void loadImage(ImageFile f) throws FileOpException {
 		logger.debug("loadImage " + f.getFile());
 		try {
 			img = ImageIO.read(f.getFile());
-			if (img == null) {
-				throw new FileOpException("Unable to load File!");
-			}
+            mimeType = f.getMimetype();
 		} catch (IOException e) {
 			throw new FileOpException("Error reading image.");
 		}
@@ -196,23 +177,27 @@
 			// clean up old reader
 			dispose();
 		}
-		// System.gc();
 		RandomAccessFile rf = new RandomAccessFile(f.getFile(), "r");
 		ImageInputStream istream = new FileImageInputStream(rf);
-		// Iterator readers = ImageIO.getImageReaders(istream);
+		Iterator<ImageReader> readers;
 		String mt = f.getMimetype();
-		logger.debug("File type:" + mt);
-		Iterator readers = ImageIO.getImageReadersByMIMEType(mt);
+		if (mt == null) {
+			logger.debug("No mime-type. Trying automagic.");
+			readers = ImageIO.getImageReaders(istream);
+		} else {
+			logger.debug("File type:" + mt);
+			readers = ImageIO.getImageReadersByMIMEType(mt);
+		}
 		if (!readers.hasNext()) {
-			throw new FileOpException("Unable to load File!");
+		    rf.close();
+			throw new FileOpException("Can't find Reader to load File!");
 		}
-		reader = (ImageReader) readers.next();
+		reader = readers.next();
 		/* are there more readers? */
 		logger.debug("ImageIO: this reader: " + reader.getClass());
-		while (readers.hasNext()) {
+		/* while (readers.hasNext()) {
 			logger.debug("ImageIO: next reader: " + readers.next().getClass());
-		}
-		// */
+		} */
 		reader.setInput(istream);
 		imgFile = f.getFile();
 		return reader;
@@ -222,7 +207,6 @@
 	public void loadSubimage(ImageFile f, Rectangle region, int prescale)
 			throws FileOpException {
 		logger.debug("loadSubimage");
-		// System.gc();
 		try {
 			if ((reader == null) || (imgFile != f.getFile())) {
 				getReader(f);
@@ -236,13 +220,11 @@
 			// read image
 			logger.debug("loading..");
 			img = reader.read(0, readParam);
+			mimeType = f.getMimetype();
 			logger.debug("loaded");
 		} catch (IOException e) {
 			throw new FileOpException("Unable to load File!");
 		}
-		if (img == null) {
-			throw new FileOpException("Unable to load File!");
-		}
 	}
 
 	/* write image of type mt to Stream */
@@ -325,15 +307,14 @@
 		AffineTransformOp scaleOp = new AffineTransformOp(AffineTransform
 				.getScaleInstance(scale, scale), renderHint);
 		BufferedImage scaledImg = null;
-		// enforce destination image type (*Java2D BUG*)
+		/* enforce destination image type (*Java2D BUG*)
 		int type = img.getType();
-		// FIXME: which type would be best?
 		if ((quality > 0) && (type != 0)) {
 			logger.debug("creating destination image");
 			Rectangle2D dstBounds = scaleOp.getBounds2D(img);
 			scaledImg = new BufferedImage((int) dstBounds.getWidth(),
 					(int) dstBounds.getHeight(), type);
-		}
+		} */
 		logger.debug("scaling...");
 		scaledImg = scaleOp.filter(img, scaledImg);
 		if (scaledImg == null) {
@@ -344,7 +325,6 @@
 		logger.debug("SCALE: " + scale + " ->" + scaledImg.getWidth() + "x"
 				+ scaledImg.getHeight());
 		img = scaledImg;
-		scaledImg = null;
 	}
 
 	public void blur(int radius) throws ImageOpException {
@@ -364,16 +344,14 @@
 		// blur with convolve operation
 		ConvolveOp blurOp = new ConvolveOp(blur, ConvolveOp.EDGE_NO_OP,
 				renderHint);
+		BufferedImage blurredImg = null;
 		// blur needs explicit destination image type for color *Java2D BUG*
-		BufferedImage blurredImg = null;
 		if (img.getType() == BufferedImage.TYPE_3BYTE_BGR) {
+			logger.debug("blur: fixing destination image type");
 			blurredImg = new BufferedImage(img.getWidth(), img.getHeight(), img
 					.getType());
 		}
 		blurredImg = blurOp.filter(img, blurredImg);
-		if (blurredImg == null) {
-			throw new ImageOpException("Unable to scale");
-		}
 		img = blurredImg;
 	}
 
@@ -381,9 +359,6 @@
 			throws ImageOpException {
 		// setup Crop
 		BufferedImage croppedImg = img.getSubimage(x_off, y_off, width, height);
-		// DEBUG
-		// util.dprintln(2, " time
-		// "+(System.currentTimeMillis()-startTime)+"ms");
 		if (croppedImg == null) {
 			throw new ImageOpException("Unable to crop");
 		}
@@ -413,12 +388,10 @@
 	}
 
 	public void enhanceRGB(float[] rgbm, float[] rgba) throws ImageOpException {
-
 		/*
 		 * The number of constants must match the number of bands in the image.
 		 * We do only 3 (RGB) bands.
 		 */
-
 		int ncol = img.getColorModel().getNumColorComponents();
 		if ((ncol != 3) || (rgbm.length != 3) || (rgba.length != 3)) {
 			logger
@@ -491,17 +464,12 @@
 		double xoff = rotbounds.getX();
 		double yoff = rotbounds.getY();
 		// move image back in line
-		trafo
-				.preConcatenate(AffineTransform.getTranslateInstance(-xoff,
-						-yoff));
+		trafo.preConcatenate(AffineTransform.getTranslateInstance(-xoff, -yoff));
 		// transform image
 		rotOp = new AffineTransformOp(trafo, renderHint);
 		BufferedImage rotImg = rotOp.filter(img, null);
 		// calculate new bounding box
 		// Rectangle2D bounds = rotOp.getBounds2D(img);
-		if (rotImg == null) {
-			throw new ImageOpException("Unable to rotate");
-		}
 		img = rotImg;
 		// crop new image (with self-made rounding)
 		/*
@@ -536,9 +504,6 @@
 		AffineTransformOp mirOp = new AffineTransformOp(new AffineTransform(mx,
 				0, 0, my, tx, ty), renderHint);
 		BufferedImage mirImg = mirOp.filter(img, null);
-		if (mirImg == null) {
-			throw new ImageOpException("Unable to mirror");
-		}
 		img = mirImg;
 	}
 
@@ -562,7 +527,7 @@
 		img = null;
 	}
 
-	public Image getImage(){
+	public Image getAwtImage(){
 		return (Image) img;
 	}