You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2010/09/10 18:33:42 UTC

svn commit: r995859 [3/30] - in /commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan: ./ color/ common/ common/byteSources/ common/mylzw/ formats/bmp/ formats/bmp/pixelparsers/ formats/bmp/writers/ formats/gif/ formats/ico/ formats/jpeg/ fo...

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/Sanselan.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/Sanselan.java?rev=995859&r1=995858&r2=995859&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/Sanselan.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/Sanselan.java Fri Sep 10 16:33:35 2010
@@ -49,1360 +49,1360 @@ import org.apache.sanselan.util.Debug;
  * <p>
  * See the source of the SampleUsage class and other classes in the
  * org.apache.sanselan.sampleUsage package for examples.
- * 
+ *
  * @see org.apache.sanselan.sampleUsage.SampleUsage
  */
 public abstract class Sanselan implements SanselanConstants {
 
-	/**
-	 * Tries to guess whether a file contains an image based on its file
-	 * extension.
-	 * <p>
-	 * Returns true if the file has a file extension associated with a file
-	 * format, such as .jpg or .gif.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File which may contain an image.
-	 * @return true if the file has an image format file extension.
-	 */
-	public static boolean hasImageFileExtension(File file) {
-		if (!file.isFile())
-			return false;
-		return hasImageFileExtension(file.getName());
-	}
-
-	/**
-	 * Tries to guess whether a filename represents an image based on its file
-	 * extension.
-	 * <p>
-	 * Returns true if the filename has a file extension associated with a file
-	 * format, such as .jpg or .gif.
-	 * <p>
-	 * 
-	 * @param filename
-	 *            String representing name of file which may contain an image.
-	 * @return true if the filename has an image format file extension.
-	 */
-	public static boolean hasImageFileExtension(String filename) {
-		filename = filename.toLowerCase();
-
-		ImageParser imageParsers[] = ImageParser.getAllImageParsers();
-		for (int i = 0; i < imageParsers.length; i++) {
-			ImageParser imageParser = imageParsers[i];
-			String exts[] = imageParser.getAcceptedExtensions();
-
-			for (int j = 0; j < exts.length; j++) {
-				String ext = exts[j];
-				if (filename.endsWith(ext.toLowerCase()))
-					return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Tries to guess what the image type (if any) of data based on the file's
-	 * "magic numbers," the first bytes of the data.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return An ImageFormat, such as ImageFormat.IMAGE_FORMAT_JPEG. Returns
-	 *         ImageFormat.IMAGE_FORMAT_UNKNOWN if the image type cannot be
-	 *         guessed.
-	 */
-	public static ImageFormat guessFormat(byte bytes[])
-			throws ImageReadException, IOException {
-		return guessFormat(new ByteSourceArray(bytes));
-	}
-
-	/**
-	 * Tries to guess what the image type (if any) of a file based on the file's
-	 * "magic numbers," the first bytes of the file.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return An ImageFormat, such as ImageFormat.IMAGE_FORMAT_JPEG. Returns
-	 *         ImageFormat.IMAGE_FORMAT_UNKNOWN if the image type cannot be
-	 *         guessed.
-	 */
-	public static ImageFormat guessFormat(File file) throws ImageReadException,
-			IOException {
-		return guessFormat(new ByteSourceFile(file));
-	}
-
-	private static final int[] MAGIC_NUMBERS_GIF = { 0x47, 0x49, };
-	private static final int[] MAGIC_NUMBERS_PNG = { 0x89, 0x50, };
-	private static final int[] MAGIC_NUMBERS_JPEG = { 0xff, 0xd8, };
-	private static final int[] MAGIC_NUMBERS_BMP = { 0x42, 0x4d, };
-	private static final int[] MAGIC_NUMBERS_TIFF_MOTOROLA = { 0x4D, 0x4D, };
-	private static final int[] MAGIC_NUMBERS_TIFF_INTEL = { 0x49, 0x49, };
-	private static final int[] MAGIC_NUMBERS_PSD = { 0x38, 0x42, };
-	private static final int[] MAGIC_NUMBERS_PBM_A = { 0x50, 0x31, };
-	private static final int[] MAGIC_NUMBERS_PBM_B = { 0x50, 0x34, };
-	private static final int[] MAGIC_NUMBERS_PGM_A = { 0x50, 0x32, };
-	private static final int[] MAGIC_NUMBERS_PGM_B = { 0x50, 0x35, };
-	private static final int[] MAGIC_NUMBERS_PPM_A = { 0x50, 0x33, };
-	private static final int[] MAGIC_NUMBERS_PPM_B = { 0x50, 0x36, };
-	private static final int[] MAGIC_NUMBERS_JBIG2_1 = { 0x97, 0x4A, };
-	private static final int[] MAGIC_NUMBERS_JBIG2_2 = { 0x42, 0x32, };
-
-	private static boolean compareBytePair(int[] a, int b[]) {
-		if (a.length != 2 && b.length != 2) {
-			throw new RuntimeException("Invalid Byte Pair.");
-		}
-		return (a[0] == b[0]) && (a[1] == b[1]);
-	}
-
-	public static ImageFormat guessFormat(ByteSource byteSource)
-			throws ImageReadException, IOException {
-		InputStream is = null;
-
-		try {
-			is = byteSource.getInputStream();
-
-			int i1 = is.read();
-			int i2 = is.read();
-			if ((i1 < 0) || (i2 < 0))
-				throw new ImageReadException(
-						"Couldn't read magic numbers to guess format.");
-
-			int b1 = i1 & 0xff;
-			int b2 = i2 & 0xff;
-			int bytePair[] = { b1, b2, };
-
-			if (compareBytePair(MAGIC_NUMBERS_GIF, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_GIF;
-			}
-			// else if (b1 == 0x00 && b2 == 0x00) // too similar to TGA
-			// {
-			// return ImageFormat.IMAGE_FORMAT_ICO;
-			// }
-			else if (compareBytePair(MAGIC_NUMBERS_PNG, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PNG;
-			} else if (compareBytePair(MAGIC_NUMBERS_JPEG, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_JPEG;
-			} else if (compareBytePair(MAGIC_NUMBERS_BMP, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_BMP;
-			} else if (compareBytePair(MAGIC_NUMBERS_TIFF_MOTOROLA, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_TIFF;
-			} else if (compareBytePair(MAGIC_NUMBERS_TIFF_INTEL, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_TIFF;
-			} else if (compareBytePair(MAGIC_NUMBERS_PSD, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PSD;
-			} else if (compareBytePair(MAGIC_NUMBERS_PBM_A, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PBM;
-			} else if (compareBytePair(MAGIC_NUMBERS_PBM_B, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PBM;
-			} else if (compareBytePair(MAGIC_NUMBERS_PGM_A, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PGM;
-			} else if (compareBytePair(MAGIC_NUMBERS_PGM_B, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PGM;
-			} else if (compareBytePair(MAGIC_NUMBERS_PPM_A, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PPM;
-			} else if (compareBytePair(MAGIC_NUMBERS_PPM_B, bytePair)) {
-				return ImageFormat.IMAGE_FORMAT_PPM;
-			} else if (compareBytePair(MAGIC_NUMBERS_JBIG2_1, bytePair)) {
-				int i3 = is.read();
-				int i4 = is.read();
-				if ((i3 < 0) || (i4 < 0))
-					throw new ImageReadException(
-							"Couldn't read magic numbers to guess format.");
-
-				int b3 = i3 & 0xff;
-				int b4 = i4 & 0xff;
-				int bytePair2[] = { b3, b4, };
-				if (compareBytePair(MAGIC_NUMBERS_JBIG2_2, bytePair2)) {
-					return ImageFormat.IMAGE_FORMAT_JBIG2;
-				}
-			}
-
-			return ImageFormat.IMAGE_FORMAT_UNKNOWN;
-		} finally {
-			if (is != null) {
-				try {
-					is.close();
-
-				} catch (IOException e) {
-					Debug.debug(e);
-
-				}
-			}
-		}
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(byte bytes[])
-			throws ImageReadException, IOException {
-		return getICCProfile(bytes, null);
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getICCProfile(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getICCProfile(is, filename, null);
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(InputStream is, String filename,
-			Map params) throws ImageReadException, IOException {
-		return getICCProfile(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(File file)
-			throws ImageReadException, IOException {
-		return getICCProfile(file, null);
-	}
-
-	/**
-	 * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
-	 * TIFF images.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ICC_Profile or null if the image contains no ICC
-	 *         profile..
-	 */
-	public static ICC_Profile getICCProfile(File file, Map params)
-			throws ImageReadException, IOException {
-		return getICCProfile(new ByteSourceFile(file), params);
-	}
-
-	protected static ICC_Profile getICCProfile(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		byte bytes[] = getICCProfileBytes(byteSource, params);
-		if (bytes == null)
-			return null;
-
-		IccProfileParser parser = new IccProfileParser();
-		IccProfileInfo info = parser.getICCProfileInfo(bytes);
-		if (info == null)
-			return null;
-		if (info.issRGB())
-			return null;
-
-		ICC_Profile icc = ICC_Profile.getInstance(bytes);
-		return icc;
-	}
-
-	/**
-	 * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
-	 * (Photoshop) and TIFF images.
-	 * <p>
-	 * To parse the result use IccProfileParser or
-	 * ICC_Profile.getInstance(bytes).
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return A byte array.
-	 * @see IccProfileParser
-	 * @see ICC_Profile
-	 */
-	public static byte[] getICCProfileBytes(byte bytes[])
-			throws ImageReadException, IOException {
-		return getICCProfileBytes(bytes, null);
-	}
-
-	/**
-	 * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
-	 * (Photoshop) and TIFF images.
-	 * <p>
-	 * To parse the result use IccProfileParser or
-	 * ICC_Profile.getInstance(bytes).
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A byte array.
-	 * @see IccProfileParser
-	 * @see ICC_Profile
-	 */
-	public static byte[] getICCProfileBytes(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getICCProfileBytes(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
-	 * (Photoshop) and TIFF images.
-	 * <p>
-	 * To parse the result use IccProfileParser or
-	 * ICC_Profile.getInstance(bytes).
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return A byte array.
-	 * @see IccProfileParser
-	 * @see ICC_Profile
-	 */
-	public static byte[] getICCProfileBytes(File file)
-			throws ImageReadException, IOException {
-		return getICCProfileBytes(file, null);
-	}
-
-	/**
-	 * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
-	 * (Photoshop) and TIFF images.
-	 * <p>
-	 * To parse the result use IccProfileParser or
-	 * ICC_Profile.getInstance(bytes).
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A byte array.
-	 * @see IccProfileParser
-	 * @see ICC_Profile
-	 */
-	public static byte[] getICCProfileBytes(File file, Map params)
-			throws ImageReadException, IOException {
-		return getICCProfileBytes(new ByteSourceFile(file), params);
-	}
-
-	private static byte[] getICCProfileBytes(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getICCProfileBytes(byteSource, params);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param filename
-	 *            String.
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(String filename, byte bytes[],
-			Map params) throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceArray(filename, bytes), params);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param filename
-	 *            String.
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(String filename, byte bytes[])
-			throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceArray(filename, bytes), null);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceInputStream(is, filename), null);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(InputStream is, String filename,
-			Map params) throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(byte bytes[])
-			throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceArray(bytes), null);
-	}
-
-	/**
-	 * Parses the "image info" of an image.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Parses the "image info" of an image file.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(File file, Map params)
-			throws ImageReadException, IOException {
-		return getImageInfo(new ByteSourceFile(file), params);
-	}
-
-	/**
-	 * Parses the "image info" of an image file.
-	 * <p>
-	 * "Image info" is a summary of basic information about the image such as:
-	 * width, height, file format, bit depth, color type, etc.
-	 * <p>
-	 * Not to be confused with "image metadata."
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return An instance of ImageInfo.
-	 * @see ImageInfo
-	 */
-	public static ImageInfo getImageInfo(File file) throws ImageReadException,
-			IOException {
-		return getImageInfo(file, null);
-	}
-
-	private static ImageInfo getImageInfo(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		ImageInfo imageInfo = imageParser.getImageInfo(byteSource, params);
-
-		return imageInfo;
-	}
-
-	private static final ImageParser getImageParser(ByteSource byteSource)
-			throws ImageReadException, IOException {
-		ImageFormat format = guessFormat(byteSource);
-		if (!format.equals(ImageFormat.IMAGE_FORMAT_UNKNOWN)) {
-
-			ImageParser imageParsers[] = ImageParser.getAllImageParsers();
-
-			for (int i = 0; i < imageParsers.length; i++) {
-				ImageParser imageParser = imageParsers[i];
-
-				if (imageParser.canAcceptType(format))
-					return imageParser;
-			}
-		}
-
-		String filename = byteSource.getFilename();
-		if (filename != null) {
-			ImageParser imageParsers[] = ImageParser.getAllImageParsers();
-
-			for (int i = 0; i < imageParsers.length; i++) {
-				ImageParser imageParser = imageParsers[i];
-
-				if (imageParser.canAcceptExtension(filename))
-					return imageParser;
-			}
-		}
-
-		throw new ImageReadException("Can't parse this format.");
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getImageSize(is, filename, null);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(InputStream is, String filename,
-			Map params) throws ImageReadException, IOException {
-		return getImageSize(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(byte bytes[])
-			throws ImageReadException, IOException {
-		return getImageSize(bytes, null);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getImageSize(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Determines the width and height of an image file.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(File file) throws ImageReadException,
-			IOException {
-		return getImageSize(file, null);
-	}
-
-	/**
-	 * Determines the width and height of an image file.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return The width and height of the image.
-	 */
-	public static Dimension getImageSize(File file, Map params)
-			throws ImageReadException, IOException {
-		return getImageSize(new ByteSourceFile(file), params);
-	}
-
-	public static Dimension getImageSize(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getImageSize(byteSource, params);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getXmpXml(is, filename, null);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(InputStream is, String filename, Map params)
-			throws ImageReadException, IOException {
-		return getXmpXml(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(byte bytes[]) throws ImageReadException,
-			IOException {
-		return getXmpXml(bytes, null);
-	}
-
-	/**
-	 * Determines the width and height of an image.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getXmpXml(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Extracts embedded XML metadata as XML string.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(File file) throws ImageReadException,
-			IOException {
-		return getXmpXml(file, null);
-	}
-
-	/**
-	 * Extracts embedded XML metadata as XML string.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(File file, Map params)
-			throws ImageReadException, IOException {
-		return getXmpXml(new ByteSourceFile(file), params);
-	}
-
-	/**
-	 * Extracts embedded XML metadata as XML string.
-	 * <p>
-	 * 
-	 * @param byteSource
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return Xmp Xml as String, if present. Otherwise, returns null.
-	 */
-	public static String getXmpXml(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getXmpXml(byteSource, params);
-	}
-
-	/**
-	 * Parses the metadata of an image. This metadata depends on the format of
-	 * the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(byte bytes[])
-			throws ImageReadException, IOException {
-		return getMetadata(bytes, null);
-	}
-
-	/**
-	 * Parses the metadata of an image. This metadata depends on the format of
-	 * the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getMetadata(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Parses the metadata of an image file. This metadata depends on the format
-	 * of the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getMetadata(is, filename, null);
-	}
-
-	/**
-	 * Parses the metadata of an image file. This metadata depends on the format
-	 * of the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(InputStream is, String filename,
-			Map params) throws ImageReadException, IOException {
-		return getMetadata(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Parses the metadata of an image file. This metadata depends on the format
-	 * of the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(File file)
-			throws ImageReadException, IOException {
-		return getMetadata(file, null);
-	}
-
-	/**
-	 * Parses the metadata of an image file. This metadata depends on the format
-	 * of the image.
-	 * <p>
-	 * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
-	 * contain comments. TIFF files may contain metadata.
-	 * <p>
-	 * The instance of IImageMetadata returned by getMetadata() should be upcast
-	 * (depending on image format).
-	 * <p>
-	 * Not to be confused with "image info."
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return An instance of IImageMetadata.
-	 * @see IImageMetadata
-	 */
-	public static IImageMetadata getMetadata(File file, Map params)
-			throws ImageReadException, IOException {
-		return getMetadata(new ByteSourceFile(file), params);
-	}
-
-	private static IImageMetadata getMetadata(ByteSource byteSource, Map params)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getMetadata(byteSource, params);
-	}
-
-	/**
-	 * Returns a description of the image's structure.
-	 * <p>
-	 * Useful for exploring format-specific details of image files.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return A description of the image file's structure.
-	 */
-	public static String dumpImageFile(byte bytes[]) throws ImageReadException,
-			IOException {
-		return dumpImageFile(new ByteSourceArray(bytes));
-	}
-
-	/**
-	 * Returns a description of the image file's structure.
-	 * <p>
-	 * Useful for exploring format-specific details of image files.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return A description of the image file's structure.
-	 */
-	public static String dumpImageFile(File file) throws ImageReadException,
-			IOException {
-		return dumpImageFile(new ByteSourceFile(file));
-	}
-
-	private static String dumpImageFile(ByteSource byteSource)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.dumpImageFile(byteSource);
-	}
-
-	public static FormatCompliance getFormatCompliance(byte bytes[])
-			throws ImageReadException, IOException {
-		return getFormatCompliance(new ByteSourceArray(bytes));
-	}
-
-	public static FormatCompliance getFormatCompliance(File file)
-			throws ImageReadException, IOException {
-		return getFormatCompliance(new ByteSourceFile(file));
-	}
-
-	private static FormatCompliance getFormatCompliance(ByteSource byteSource)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getFormatCompliance(byteSource);
-	}
-
-	/**
-	 * Returns all images contained in an image.
-	 * <p>
-	 * Useful for image formats such as GIF and ICO in which a single file may
-	 * contain multiple images.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream from which to read image data.
-	 * @param filename
-	 *            Filename associated with image data (optional).
-	 * @return A vector of BufferedImages.
-	 */
-	public static ArrayList getAllBufferedImages(InputStream is, String filename)
-			throws ImageReadException, IOException {
-		return getAllBufferedImages(new ByteSourceInputStream(is, filename));
-	}
-
-	/**
-	 * Returns all images contained in an image.
-	 * <p>
-	 * Useful for image formats such as GIF and ICO in which a single file may
-	 * contain multiple images.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return A vector of BufferedImages.
-	 */
-	public static ArrayList getAllBufferedImages(byte bytes[])
-			throws ImageReadException, IOException {
-		return getAllBufferedImages(new ByteSourceArray(bytes));
-	}
-
-	/**
-	 * Returns all images contained in an image file.
-	 * <p>
-	 * Useful for image formats such as GIF and ICO in which a single file may
-	 * contain multiple images.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return A vector of BufferedImages.
-	 */
-	public static ArrayList getAllBufferedImages(File file)
-			throws ImageReadException, IOException {
-		return getAllBufferedImages(new ByteSourceFile(file));
-	}
-
-	private static ArrayList getAllBufferedImages(ByteSource byteSource)
-			throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-
-		return imageParser.getAllBufferedImages(byteSource);
-	}
-
-	// public static boolean extractImages(byte bytes[], File dstDir,
-	// String dstRoot, ImageParser encoder) throws ImageReadException,
-	// IOException, ImageWriteException
-	// {
-	// return extractImages(new ByteSourceArray(bytes), dstDir, dstRoot,
-	// encoder);
-	// }
-	//
-	// public static boolean extractImages(File file, File dstDir, String
-	// dstRoot,
-	// ImageParser encoder) throws ImageReadException, IOException,
-	// ImageWriteException
-	// {
-	// return extractImages(new ByteSourceFile(file), dstDir, dstRoot, encoder);
-	// }
-	//
-	// public static boolean extractImages(ByteSource byteSource, File dstDir,
-	// String dstRoot, ImageParser encoder) throws ImageReadException,
-	// IOException, ImageWriteException
-	// {
-	// ImageParser imageParser = getImageParser(byteSource);
-	//
-	// return imageParser.extractImages(byteSource, dstDir, dstRoot, encoder);
-	// }
-
-	/**
-	 * Reads the first image from an InputStream as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream to read image data from.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(InputStream is)
-			throws ImageReadException, IOException {
-		return getBufferedImage(is, null);
-	}
-
-	/**
-	 * Reads the first image from an InputStream as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param is
-	 *            InputStream to read image data from.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(InputStream is, Map params)
-			throws ImageReadException, IOException {
-		String filename = null;
-		if (params != null && params.containsKey(PARAM_KEY_FILENAME))
-			filename = (String) params.get(PARAM_KEY_FILENAME);
-		return getBufferedImage(new ByteSourceInputStream(is, filename), params);
-	}
-
-	/**
-	 * Reads the first image from an image file as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(byte bytes[])
-			throws ImageReadException, IOException {
-		return getBufferedImage(new ByteSourceArray(bytes), null);
-	}
-
-	/**
-	 * Reads the first image from an image file as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param bytes
-	 *            Byte array containing an image file.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(byte bytes[], Map params)
-			throws ImageReadException, IOException {
-		return getBufferedImage(new ByteSourceArray(bytes), params);
-	}
-
-	/**
-	 * Reads the first image from an image file as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(File file)
-			throws ImageReadException, IOException {
-		return getBufferedImage(new ByteSourceFile(file), null);
-	}
-
-	/**
-	 * Reads the first image from an image file as a BufferedImage.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param file
-	 *            File containing image data.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A BufferedImage.
-	 * @see SanselanConstants
-	 */
-	public static BufferedImage getBufferedImage(File file, Map params)
-			throws ImageReadException, IOException {
-		return getBufferedImage(new ByteSourceFile(file), params);
-	}
-
-	private static BufferedImage getBufferedImage(ByteSource byteSource,
-			Map params) throws ImageReadException, IOException {
-		ImageParser imageParser = getImageParser(byteSource);
-		if (null == params)
-			params = new HashMap();
-
-		return imageParser.getBufferedImage(byteSource, params);
-	}
-
-	/**
-	 * Writes a BufferedImage to a file.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param src
-	 *            The BufferedImage to be written.
-	 * @param file
-	 *            File to write to.
-	 * @param format
-	 *            The ImageFormat to use.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @see SanselanConstants
-	 */
-	public static void writeImage(BufferedImage src, File file,
-			ImageFormat format, Map params) throws ImageWriteException,
-			IOException {
-		OutputStream os = null;
-
-		try {
-			os = new FileOutputStream(file);
-			os = new BufferedOutputStream(os);
-
-			writeImage(src, os, format, params);
-		} finally {
-			try {
-				if (os != null)
-					os.close();
-			} catch (Exception e) {
-				Debug.debug(e);
-			}
-		}
-	}
-
-	/**
-	 * Writes a BufferedImage to a byte array.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param src
-	 *            The BufferedImage to be written.
-	 * @param format
-	 *            The ImageFormat to use.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @return A byte array containing the image file.
-	 * @see SanselanConstants
-	 */
-	public static byte[] writeImageToBytes(BufferedImage src,
-			ImageFormat format, Map params) throws ImageWriteException,
-			IOException {
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-
-		writeImage(src, os, format, params);
-
-		return os.toByteArray();
-	}
-
-	/**
-	 * Writes a BufferedImage to an OutputStream.
-	 * <p>
-	 * (TODO: elaborate here.)
-	 * <p>
-	 * Sanselan can only read image info, metadata and ICC profiles from all
-	 * image formats. However, note that the library cannot currently read or
-	 * write JPEG image data. PSD (Photoshop) files can only be partially read
-	 * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
-	 * fully supported.
-	 * <p>
-	 * 
-	 * @param src
-	 *            The BufferedImage to be written.
-	 * @param os
-	 *            The OutputStream to write to.
-	 * @param format
-	 *            The ImageFormat to use.
-	 * @param params
-	 *            Map of optional parameters, defined in SanselanConstants.
-	 * @see SanselanConstants
-	 */
-	public static void writeImage(BufferedImage src, OutputStream os,
-			ImageFormat format, Map params) throws ImageWriteException,
-			IOException {
-		ImageParser imageParsers[] = ImageParser.getAllImageParsers();
-
-		// make sure params are non-null
-		if (params == null)
-			params = new HashMap();
-
-		params.put(PARAM_KEY_FORMAT, format);
-
-		for (int i = 0; i < imageParsers.length; i++) {
-			ImageParser imageParser = imageParsers[i];
-
-			if (!imageParser.canAcceptType(format))
-				continue;
-
-			imageParser.writeImage(src, os, params);
-			return;
-		}
+    /**
+     * Tries to guess whether a file contains an image based on its file
+     * extension.
+     * <p>
+     * Returns true if the file has a file extension associated with a file
+     * format, such as .jpg or .gif.
+     * <p>
+     *
+     * @param file
+     *            File which may contain an image.
+     * @return true if the file has an image format file extension.
+     */
+    public static boolean hasImageFileExtension(File file) {
+        if (!file.isFile())
+            return false;
+        return hasImageFileExtension(file.getName());
+    }
+
+    /**
+     * Tries to guess whether a filename represents an image based on its file
+     * extension.
+     * <p>
+     * Returns true if the filename has a file extension associated with a file
+     * format, such as .jpg or .gif.
+     * <p>
+     *
+     * @param filename
+     *            String representing name of file which may contain an image.
+     * @return true if the filename has an image format file extension.
+     */
+    public static boolean hasImageFileExtension(String filename) {
+        filename = filename.toLowerCase();
+
+        ImageParser imageParsers[] = ImageParser.getAllImageParsers();
+        for (int i = 0; i < imageParsers.length; i++) {
+            ImageParser imageParser = imageParsers[i];
+            String exts[] = imageParser.getAcceptedExtensions();
+
+            for (int j = 0; j < exts.length; j++) {
+                String ext = exts[j];
+                if (filename.endsWith(ext.toLowerCase()))
+                    return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Tries to guess what the image type (if any) of data based on the file's
+     * "magic numbers," the first bytes of the data.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return An ImageFormat, such as ImageFormat.IMAGE_FORMAT_JPEG. Returns
+     *         ImageFormat.IMAGE_FORMAT_UNKNOWN if the image type cannot be
+     *         guessed.
+     */
+    public static ImageFormat guessFormat(byte bytes[])
+            throws ImageReadException, IOException {
+        return guessFormat(new ByteSourceArray(bytes));
+    }
+
+    /**
+     * Tries to guess what the image type (if any) of a file based on the file's
+     * "magic numbers," the first bytes of the file.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return An ImageFormat, such as ImageFormat.IMAGE_FORMAT_JPEG. Returns
+     *         ImageFormat.IMAGE_FORMAT_UNKNOWN if the image type cannot be
+     *         guessed.
+     */
+    public static ImageFormat guessFormat(File file) throws ImageReadException,
+            IOException {
+        return guessFormat(new ByteSourceFile(file));
+    }
+
+    private static final int[] MAGIC_NUMBERS_GIF = { 0x47, 0x49, };
+    private static final int[] MAGIC_NUMBERS_PNG = { 0x89, 0x50, };
+    private static final int[] MAGIC_NUMBERS_JPEG = { 0xff, 0xd8, };
+    private static final int[] MAGIC_NUMBERS_BMP = { 0x42, 0x4d, };
+    private static final int[] MAGIC_NUMBERS_TIFF_MOTOROLA = { 0x4D, 0x4D, };
+    private static final int[] MAGIC_NUMBERS_TIFF_INTEL = { 0x49, 0x49, };
+    private static final int[] MAGIC_NUMBERS_PSD = { 0x38, 0x42, };
+    private static final int[] MAGIC_NUMBERS_PBM_A = { 0x50, 0x31, };
+    private static final int[] MAGIC_NUMBERS_PBM_B = { 0x50, 0x34, };
+    private static final int[] MAGIC_NUMBERS_PGM_A = { 0x50, 0x32, };
+    private static final int[] MAGIC_NUMBERS_PGM_B = { 0x50, 0x35, };
+    private static final int[] MAGIC_NUMBERS_PPM_A = { 0x50, 0x33, };
+    private static final int[] MAGIC_NUMBERS_PPM_B = { 0x50, 0x36, };
+    private static final int[] MAGIC_NUMBERS_JBIG2_1 = { 0x97, 0x4A, };
+    private static final int[] MAGIC_NUMBERS_JBIG2_2 = { 0x42, 0x32, };
+
+    private static boolean compareBytePair(int[] a, int b[]) {
+        if (a.length != 2 && b.length != 2) {
+            throw new RuntimeException("Invalid Byte Pair.");
+        }
+        return (a[0] == b[0]) && (a[1] == b[1]);
+    }
+
+    public static ImageFormat guessFormat(ByteSource byteSource)
+            throws ImageReadException, IOException {
+        InputStream is = null;
+
+        try {
+            is = byteSource.getInputStream();
+
+            int i1 = is.read();
+            int i2 = is.read();
+            if ((i1 < 0) || (i2 < 0))
+                throw new ImageReadException(
+                        "Couldn't read magic numbers to guess format.");
+
+            int b1 = i1 & 0xff;
+            int b2 = i2 & 0xff;
+            int bytePair[] = { b1, b2, };
+
+            if (compareBytePair(MAGIC_NUMBERS_GIF, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_GIF;
+            }
+            // else if (b1 == 0x00 && b2 == 0x00) // too similar to TGA
+            // {
+            // return ImageFormat.IMAGE_FORMAT_ICO;
+            // }
+            else if (compareBytePair(MAGIC_NUMBERS_PNG, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PNG;
+            } else if (compareBytePair(MAGIC_NUMBERS_JPEG, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_JPEG;
+            } else if (compareBytePair(MAGIC_NUMBERS_BMP, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_BMP;
+            } else if (compareBytePair(MAGIC_NUMBERS_TIFF_MOTOROLA, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_TIFF;
+            } else if (compareBytePair(MAGIC_NUMBERS_TIFF_INTEL, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_TIFF;
+            } else if (compareBytePair(MAGIC_NUMBERS_PSD, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PSD;
+            } else if (compareBytePair(MAGIC_NUMBERS_PBM_A, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PBM;
+            } else if (compareBytePair(MAGIC_NUMBERS_PBM_B, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PBM;
+            } else if (compareBytePair(MAGIC_NUMBERS_PGM_A, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PGM;
+            } else if (compareBytePair(MAGIC_NUMBERS_PGM_B, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PGM;
+            } else if (compareBytePair(MAGIC_NUMBERS_PPM_A, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PPM;
+            } else if (compareBytePair(MAGIC_NUMBERS_PPM_B, bytePair)) {
+                return ImageFormat.IMAGE_FORMAT_PPM;
+            } else if (compareBytePair(MAGIC_NUMBERS_JBIG2_1, bytePair)) {
+                int i3 = is.read();
+                int i4 = is.read();
+                if ((i3 < 0) || (i4 < 0))
+                    throw new ImageReadException(
+                            "Couldn't read magic numbers to guess format.");
+
+                int b3 = i3 & 0xff;
+                int b4 = i4 & 0xff;
+                int bytePair2[] = { b3, b4, };
+                if (compareBytePair(MAGIC_NUMBERS_JBIG2_2, bytePair2)) {
+                    return ImageFormat.IMAGE_FORMAT_JBIG2;
+                }
+            }
+
+            return ImageFormat.IMAGE_FORMAT_UNKNOWN;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+
+                } catch (IOException e) {
+                    Debug.debug(e);
+
+                }
+            }
+        }
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(byte bytes[])
+            throws ImageReadException, IOException {
+        return getICCProfile(bytes, null);
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getICCProfile(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getICCProfile(is, filename, null);
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(InputStream is, String filename,
+            Map params) throws ImageReadException, IOException {
+        return getICCProfile(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(File file)
+            throws ImageReadException, IOException {
+        return getICCProfile(file, null);
+    }
+
+    /**
+     * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and
+     * TIFF images.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ICC_Profile or null if the image contains no ICC
+     *         profile..
+     */
+    public static ICC_Profile getICCProfile(File file, Map params)
+            throws ImageReadException, IOException {
+        return getICCProfile(new ByteSourceFile(file), params);
+    }
+
+    protected static ICC_Profile getICCProfile(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        byte bytes[] = getICCProfileBytes(byteSource, params);
+        if (bytes == null)
+            return null;
+
+        IccProfileParser parser = new IccProfileParser();
+        IccProfileInfo info = parser.getICCProfileInfo(bytes);
+        if (info == null)
+            return null;
+        if (info.issRGB())
+            return null;
+
+        ICC_Profile icc = ICC_Profile.getInstance(bytes);
+        return icc;
+    }
+
+    /**
+     * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
+     * (Photoshop) and TIFF images.
+     * <p>
+     * To parse the result use IccProfileParser or
+     * ICC_Profile.getInstance(bytes).
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return A byte array.
+     * @see IccProfileParser
+     * @see ICC_Profile
+     */
+    public static byte[] getICCProfileBytes(byte bytes[])
+            throws ImageReadException, IOException {
+        return getICCProfileBytes(bytes, null);
+    }
+
+    /**
+     * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
+     * (Photoshop) and TIFF images.
+     * <p>
+     * To parse the result use IccProfileParser or
+     * ICC_Profile.getInstance(bytes).
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return A byte array.
+     * @see IccProfileParser
+     * @see ICC_Profile
+     */
+    public static byte[] getICCProfileBytes(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getICCProfileBytes(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
+     * (Photoshop) and TIFF images.
+     * <p>
+     * To parse the result use IccProfileParser or
+     * ICC_Profile.getInstance(bytes).
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return A byte array.
+     * @see IccProfileParser
+     * @see ICC_Profile
+     */
+    public static byte[] getICCProfileBytes(File file)
+            throws ImageReadException, IOException {
+        return getICCProfileBytes(file, null);
+    }
+
+    /**
+     * Extracts the raw bytes of an ICC Profile (if present) from JPEG, PNG, PSD
+     * (Photoshop) and TIFF images.
+     * <p>
+     * To parse the result use IccProfileParser or
+     * ICC_Profile.getInstance(bytes).
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return A byte array.
+     * @see IccProfileParser
+     * @see ICC_Profile
+     */
+    public static byte[] getICCProfileBytes(File file, Map params)
+            throws ImageReadException, IOException {
+        return getICCProfileBytes(new ByteSourceFile(file), params);
+    }
+
+    private static byte[] getICCProfileBytes(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getICCProfileBytes(byteSource, params);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param filename
+     *            String.
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(String filename, byte bytes[],
+            Map params) throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceArray(filename, bytes), params);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param filename
+     *            String.
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(String filename, byte bytes[])
+            throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceArray(filename, bytes), null);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceInputStream(is, filename), null);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(InputStream is, String filename,
+            Map params) throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(byte bytes[])
+            throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceArray(bytes), null);
+    }
+
+    /**
+     * Parses the "image info" of an image.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Parses the "image info" of an image file.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(File file, Map params)
+            throws ImageReadException, IOException {
+        return getImageInfo(new ByteSourceFile(file), params);
+    }
+
+    /**
+     * Parses the "image info" of an image file.
+     * <p>
+     * "Image info" is a summary of basic information about the image such as:
+     * width, height, file format, bit depth, color type, etc.
+     * <p>
+     * Not to be confused with "image metadata."
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return An instance of ImageInfo.
+     * @see ImageInfo
+     */
+    public static ImageInfo getImageInfo(File file) throws ImageReadException,
+            IOException {
+        return getImageInfo(file, null);
+    }
+
+    private static ImageInfo getImageInfo(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        ImageInfo imageInfo = imageParser.getImageInfo(byteSource, params);
+
+        return imageInfo;
+    }
+
+    private static final ImageParser getImageParser(ByteSource byteSource)
+            throws ImageReadException, IOException {
+        ImageFormat format = guessFormat(byteSource);
+        if (!format.equals(ImageFormat.IMAGE_FORMAT_UNKNOWN)) {
+
+            ImageParser imageParsers[] = ImageParser.getAllImageParsers();
+
+            for (int i = 0; i < imageParsers.length; i++) {
+                ImageParser imageParser = imageParsers[i];
+
+                if (imageParser.canAcceptType(format))
+                    return imageParser;
+            }
+        }
+
+        String filename = byteSource.getFilename();
+        if (filename != null) {
+            ImageParser imageParsers[] = ImageParser.getAllImageParsers();
+
+            for (int i = 0; i < imageParsers.length; i++) {
+                ImageParser imageParser = imageParsers[i];
+
+                if (imageParser.canAcceptExtension(filename))
+                    return imageParser;
+            }
+        }
+
+        throw new ImageReadException("Can't parse this format.");
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getImageSize(is, filename, null);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(InputStream is, String filename,
+            Map params) throws ImageReadException, IOException {
+        return getImageSize(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(byte bytes[])
+            throws ImageReadException, IOException {
+        return getImageSize(bytes, null);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getImageSize(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Determines the width and height of an image file.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(File file) throws ImageReadException,
+            IOException {
+        return getImageSize(file, null);
+    }
+
+    /**
+     * Determines the width and height of an image file.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return The width and height of the image.
+     */
+    public static Dimension getImageSize(File file, Map params)
+            throws ImageReadException, IOException {
+        return getImageSize(new ByteSourceFile(file), params);
+    }
+
+    public static Dimension getImageSize(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getImageSize(byteSource, params);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getXmpXml(is, filename, null);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(InputStream is, String filename, Map params)
+            throws ImageReadException, IOException {
+        return getXmpXml(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(byte bytes[]) throws ImageReadException,
+            IOException {
+        return getXmpXml(bytes, null);
+    }
+
+    /**
+     * Determines the width and height of an image.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getXmpXml(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Extracts embedded XML metadata as XML string.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(File file) throws ImageReadException,
+            IOException {
+        return getXmpXml(file, null);
+    }
+
+    /**
+     * Extracts embedded XML metadata as XML string.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(File file, Map params)
+            throws ImageReadException, IOException {
+        return getXmpXml(new ByteSourceFile(file), params);
+    }
+
+    /**
+     * Extracts embedded XML metadata as XML string.
+     * <p>
+     *
+     * @param byteSource
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return Xmp Xml as String, if present. Otherwise, returns null.
+     */
+    public static String getXmpXml(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getXmpXml(byteSource, params);
+    }
+
+    /**
+     * Parses the metadata of an image. This metadata depends on the format of
+     * the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(byte bytes[])
+            throws ImageReadException, IOException {
+        return getMetadata(bytes, null);
+    }
+
+    /**
+     * Parses the metadata of an image. This metadata depends on the format of
+     * the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getMetadata(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Parses the metadata of an image file. This metadata depends on the format
+     * of the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getMetadata(is, filename, null);
+    }
+
+    /**
+     * Parses the metadata of an image file. This metadata depends on the format
+     * of the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(InputStream is, String filename,
+            Map params) throws ImageReadException, IOException {
+        return getMetadata(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Parses the metadata of an image file. This metadata depends on the format
+     * of the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(File file)
+            throws ImageReadException, IOException {
+        return getMetadata(file, null);
+    }
+
+    /**
+     * Parses the metadata of an image file. This metadata depends on the format
+     * of the image.
+     * <p>
+     * JPEG/JFIF files may contain EXIF and/or IPTC metadata. PNG files may
+     * contain comments. TIFF files may contain metadata.
+     * <p>
+     * The instance of IImageMetadata returned by getMetadata() should be upcast
+     * (depending on image format).
+     * <p>
+     * Not to be confused with "image info."
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return An instance of IImageMetadata.
+     * @see IImageMetadata
+     */
+    public static IImageMetadata getMetadata(File file, Map params)
+            throws ImageReadException, IOException {
+        return getMetadata(new ByteSourceFile(file), params);
+    }
+
+    private static IImageMetadata getMetadata(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getMetadata(byteSource, params);
+    }
+
+    /**
+     * Returns a description of the image's structure.
+     * <p>
+     * Useful for exploring format-specific details of image files.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return A description of the image file's structure.
+     */
+    public static String dumpImageFile(byte bytes[]) throws ImageReadException,
+            IOException {
+        return dumpImageFile(new ByteSourceArray(bytes));
+    }
+
+    /**
+     * Returns a description of the image file's structure.
+     * <p>
+     * Useful for exploring format-specific details of image files.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return A description of the image file's structure.
+     */
+    public static String dumpImageFile(File file) throws ImageReadException,
+            IOException {
+        return dumpImageFile(new ByteSourceFile(file));
+    }
+
+    private static String dumpImageFile(ByteSource byteSource)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.dumpImageFile(byteSource);
+    }
+
+    public static FormatCompliance getFormatCompliance(byte bytes[])
+            throws ImageReadException, IOException {
+        return getFormatCompliance(new ByteSourceArray(bytes));
+    }
+
+    public static FormatCompliance getFormatCompliance(File file)
+            throws ImageReadException, IOException {
+        return getFormatCompliance(new ByteSourceFile(file));
+    }
+
+    private static FormatCompliance getFormatCompliance(ByteSource byteSource)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getFormatCompliance(byteSource);
+    }
+
+    /**
+     * Returns all images contained in an image.
+     * <p>
+     * Useful for image formats such as GIF and ICO in which a single file may
+     * contain multiple images.
+     * <p>
+     *
+     * @param is
+     *            InputStream from which to read image data.
+     * @param filename
+     *            Filename associated with image data (optional).
+     * @return A vector of BufferedImages.
+     */
+    public static ArrayList getAllBufferedImages(InputStream is, String filename)
+            throws ImageReadException, IOException {
+        return getAllBufferedImages(new ByteSourceInputStream(is, filename));
+    }
+
+    /**
+     * Returns all images contained in an image.
+     * <p>
+     * Useful for image formats such as GIF and ICO in which a single file may
+     * contain multiple images.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return A vector of BufferedImages.
+     */
+    public static ArrayList getAllBufferedImages(byte bytes[])
+            throws ImageReadException, IOException {
+        return getAllBufferedImages(new ByteSourceArray(bytes));
+    }
+
+    /**
+     * Returns all images contained in an image file.
+     * <p>
+     * Useful for image formats such as GIF and ICO in which a single file may
+     * contain multiple images.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return A vector of BufferedImages.
+     */
+    public static ArrayList getAllBufferedImages(File file)
+            throws ImageReadException, IOException {
+        return getAllBufferedImages(new ByteSourceFile(file));
+    }
+
+    private static ArrayList getAllBufferedImages(ByteSource byteSource)
+            throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+
+        return imageParser.getAllBufferedImages(byteSource);
+    }
+
+    // public static boolean extractImages(byte bytes[], File dstDir,
+    // String dstRoot, ImageParser encoder) throws ImageReadException,
+    // IOException, ImageWriteException
+    // {
+    // return extractImages(new ByteSourceArray(bytes), dstDir, dstRoot,
+    // encoder);
+    // }
+    //
+    // public static boolean extractImages(File file, File dstDir, String
+    // dstRoot,
+    // ImageParser encoder) throws ImageReadException, IOException,
+    // ImageWriteException
+    // {
+    // return extractImages(new ByteSourceFile(file), dstDir, dstRoot, encoder);
+    // }
+    //
+    // public static boolean extractImages(ByteSource byteSource, File dstDir,
+    // String dstRoot, ImageParser encoder) throws ImageReadException,
+    // IOException, ImageWriteException
+    // {
+    // ImageParser imageParser = getImageParser(byteSource);
+    //
+    // return imageParser.extractImages(byteSource, dstDir, dstRoot, encoder);
+    // }
+
+    /**
+     * Reads the first image from an InputStream as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param is
+     *            InputStream to read image data from.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(InputStream is)
+            throws ImageReadException, IOException {
+        return getBufferedImage(is, null);
+    }
+
+    /**
+     * Reads the first image from an InputStream as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param is
+     *            InputStream to read image data from.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(InputStream is, Map params)
+            throws ImageReadException, IOException {
+        String filename = null;
+        if (params != null && params.containsKey(PARAM_KEY_FILENAME))
+            filename = (String) params.get(PARAM_KEY_FILENAME);
+        return getBufferedImage(new ByteSourceInputStream(is, filename), params);
+    }
+
+    /**
+     * Reads the first image from an image file as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(byte bytes[])
+            throws ImageReadException, IOException {
+        return getBufferedImage(new ByteSourceArray(bytes), null);
+    }
+
+    /**
+     * Reads the first image from an image file as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param bytes
+     *            Byte array containing an image file.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(byte bytes[], Map params)
+            throws ImageReadException, IOException {
+        return getBufferedImage(new ByteSourceArray(bytes), params);
+    }
+
+    /**
+     * Reads the first image from an image file as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(File file)
+            throws ImageReadException, IOException {
+        return getBufferedImage(new ByteSourceFile(file), null);
+    }
+
+    /**
+     * Reads the first image from an image file as a BufferedImage.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param file
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return A BufferedImage.
+     * @see SanselanConstants
+     */
+    public static BufferedImage getBufferedImage(File file, Map params)
+            throws ImageReadException, IOException {
+        return getBufferedImage(new ByteSourceFile(file), params);
+    }
+
+    private static BufferedImage getBufferedImage(ByteSource byteSource,
+            Map params) throws ImageReadException, IOException {
+        ImageParser imageParser = getImageParser(byteSource);
+        if (null == params)
+            params = new HashMap();
+
+        return imageParser.getBufferedImage(byteSource, params);
+    }
+
+    /**
+     * Writes a BufferedImage to a file.
+     * <p>
+     * (TODO: elaborate here.)
+     * <p>
+     * Sanselan can only read image info, metadata and ICC profiles from all
+     * image formats. However, note that the library cannot currently read or
+     * write JPEG image data. PSD (Photoshop) files can only be partially read
+     * and cannot be written. All other formats (PNG, GIF, TIFF, BMP, etc.) are
+     * fully supported.
+     * <p>
+     *
+     * @param src
+     *            The BufferedImage to be written.
+     * @param file
+     *            File to write to.
+     * @param format
+     *            The ImageFormat to use.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.

[... 104 lines stripped ...]