Mercurial > hg > digilib-old
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; }