Mercurial > hg > digilib-old
diff servlet/src/digilib/io/ImageFileset.java @ 339:6d2032b6121d gen2_1
new directory and cache work
author | robcast |
---|---|
date | Wed, 17 Nov 2004 18:17:34 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlet/src/digilib/io/ImageFileset.java Wed Nov 17 18:17:34 2004 +0100 @@ -0,0 +1,326 @@ +/* ImageFileset -- digilib image file info class. + * Digital Image Library servlet components + * Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de) + * + * This program is free software; you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * Please read license.txt for the full details. A copy of the GPL may be + * found at http://www.gnu.org/copyleft/lgpl.html + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package digilib.io; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +import digilib.image.ImageOps; +import digilib.image.ImageSize; + +/** + * @author casties + */ +public class ImageFileset extends DigiDirent { + + /** this is an image file */ + protected static int FILE_CLASS = FileOps.CLASS_IMAGE; + + /** list of files (ImageFile) */ + private List files; + + /** resolution of the biggest image (DPI) */ + private float resX = 0; + + /** resolution of the biggest image (DPI) */ + private float resY = 0; + + /** + * Constructor with a file and hints. + * + * The hints are expected to contain 'basedirs' and 'scaledfilext' keys. + * + * @param file + * @param hints + */ + public ImageFileset(File file, DigiDirectory parent, Map hints) { + super(file.getName(), parent); + files = new ArrayList(FileOps.getBaseDirs().length); + fill(file, hints); + } + + /** + * Gets the default File. + * + */ + public ImageFile getFile() { + return (files != null) ? (ImageFile) files.get(0) : null; + } + + /** + * Get the ImageFile at the index. + * + * + * @param index + * @return + */ + public ImageFile get(int index) { + return (files != null) ? (ImageFile) files.get(index) : null; + } + + /** + * Get the next smaller ImageFile than the given size. + * + * Returns the ImageFile from the set that has a width and height smaller or + * equal the given size. Returns null if there isn't any smaller image. + * Needs DocuInfo instance to checkFile(). + * + * + * @param size + * @param info + * @return + */ + public ImageFile getNextSmaller(ImageSize size) { + for (Iterator i = getHiresIterator(); i.hasNext();) { + ImageFile f = (ImageFile) i.next(); + try { + ImageOps.checkFile(f); + if (f.getSize().isTotallySmallerThan(size)) { + return f; + } + } catch (IOException e) { + } + } + return null; + } + + /** + * Get the next bigger ImageFile than the given size. + * + * Returns the ImageFile from the set that has a width or height bigger or + * equal the given size. Returns null if there isn't any bigger image. Needs + * DocuInfo instance to checkFile(). + * + * + * @param size + * @param info + * @return + */ + public ImageFile getNextBigger(ImageSize size) { + for (ListIterator i = getLoresIterator(); i.hasPrevious();) { + ImageFile f = (ImageFile) i.previous(); + try { + ImageOps.checkFile(f); + if (f.getSize().isBiggerThan(size)) { + return f; + } + } catch (IOException e) { + } + } + return null; + } + + /** + * Returns the biggest ImageFile in the set. + * + * + * @return + */ + public ImageFile getBiggest() { + return (ImageFile) files.get(0); + } + + /** + * Returns the biggest ImageFile in the set. + * + * + * @return + */ + public ImageFile getSmallest() { + return (ImageFile) files.get(files.size() - 1); + } + + /** + * Get an Iterator for this Fileset starting at the highest resolution + * images. + * + * + * @return + */ + public ListIterator getHiresIterator() { + return files.listIterator(); + } + + /** + * Get an Iterator for this Fileset starting at the lowest resolution + * images. + * + * The Iterator starts at the last element, so you have to use it backwards + * with hasPrevious() and previous(). + * + * + * @return + */ + public ListIterator getLoresIterator() { + return files.listIterator(files.size()); + } + + /** + * Fill the ImageFileset with files from different base directories. + * + * + * @param dirs + * list of base directories + * @param imf + * file (from first base dir) + * @param hints + * + */ + void fill(File imf, Map hints) { + File[][] scaledirs = (File[][]) hints.get(FileOps.HINT_BASEDIRS); + File[] bd = FileOps.getBaseDirs(); + int nb = bd.length; + if (scaledirs == null) { + // read all scaled directories + scaledirs = new File[nb][]; + for (int i = 1; i < nb; i++) { + // check basedir + digilib path + File d = FileOps.getRealFile(bd[i], parent.getDLPath()); + scaledirs[i] = d.listFiles(); + } + hints.put(FileOps.HINT_BASEDIRS, scaledirs); + } + // add the first ImageFile to the ImageFileset + files.add(new ImageFile(imf)); + // iterate the remaining base directories + for (int dirIdx = 1; dirIdx < nb; dirIdx++) { + if (scaledirs[dirIdx] == null) { + continue; + } + // find the file in the directory + File fn = FileOps.findFile(imf, scaledirs[dirIdx]); + if (fn == null) { + continue; + } + if (FileOps.classForFile(fn) == FileOps.CLASS_IMAGE) { + // add to the fileset + files.add(new ImageFile(fn)); + } + } + } + + /** + * Reads metadata and sets resolution in resX and resY. + * + */ + public void readMeta() { + if (isMetaRead) { + return; + } + // read the metadata file + super.readMeta(); + if (meta == null) { + // try directory metadata + meta = parent.getMeta(); + if (meta == null) { + // no metadata available + isMetaRead = true; + return; + } + } + isMetaRead = true; + String s; + float dpi = 0; + float dpix = 0; + float dpiy = 0; + float sizex = 0; + float sizey = 0; + float pixx = 0; + float pixy = 0; + // DPI is valid for X and Y + if (meta.containsKey("original-dpi")) { + try { + dpi = Float.parseFloat((String) meta.get("original-dpi")); + } catch (NumberFormatException e) { + } + if (dpi != 0) { + resX = dpi; + resY = dpi; + return; + } + } + // DPI-X and DPI-Y + if (meta.containsKey("original-dpi-x") + && meta.containsKey("original-dpi-y")) { + try { + dpix = Float.parseFloat((String) meta.get("original-dpi-x")); + dpiy = Float.parseFloat((String) meta.get("original-dpi-y")); + } catch (NumberFormatException e) { + } + if ((dpix != 0) && (dpiy != 0)) { + resX = dpix; + resY = dpiy; + return; + } + } + // SIZE-X and SIZE-Y and PIXEL-X and PIXEL-Y + if (meta.containsKey("original-size-x") + && meta.containsKey("original-size-y") + && meta.containsKey("original-pixel-x") + && meta.containsKey("original-pixel-y")) { + try { + sizex = Float.parseFloat((String) meta.get("original-size-x")); + sizey = Float.parseFloat((String) meta.get("original-size-y")); + pixx = Float.parseFloat((String) meta.get("original-pixel-x")); + pixy = Float.parseFloat((String) meta.get("original-pixel-y")); + } catch (NumberFormatException e) { + } + if ((sizex != 0) && (sizey != 0) && (pixx != 0) && (pixy != 0)) { + resX = pixx / (sizex * 100 / 2.54f); + resY = pixy / (sizey * 100 / 2.54f); + return; + } + } + } + + /** + * Returns the aspect ratio of the images. + * + * @return + */ + public float getAspect() { + for (Iterator i = files.iterator(); i.hasNext();) { + ImageFile f = (ImageFile) i.next(); + ImageSize s = f.getSize(); + if (s != null) { + return s.getAspect(); + } + } + return 0f; + } + + /** + * @return + */ + public float getResX() { + return resX; + } + + /** + * @return + */ + public float getResY() { + return resY; + } + +} \ No newline at end of file