blob: d9c3bbba06fdfecbce110db228cbbca213b5b3b7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.imaging;
import java.awt.Dimension;
import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.imaging.common.IImageMetadata;
import org.apache.commons.imaging.common.bytesource.ByteSource;
import org.apache.commons.imaging.common.bytesource.ByteSourceArray;
import org.apache.commons.imaging.common.bytesource.ByteSourceFile;
import org.apache.commons.imaging.common.bytesource.ByteSourceInputStream;
import org.apache.commons.imaging.icc.IccProfileInfo;
import org.apache.commons.imaging.icc.IccProfileParser;
import org.apache.commons.imaging.util.Debug;
/**
* The primary interface to the sanselan library.
* <p>
* Almost all of the Sanselan library's core functionality can be accessed
* through it's methods.
* <p>
* All of Sanselan's methods are static.
* <p>
* See the source of the SampleUsage class and other classes in the
* org.apache.commons.sanselan.examples package for examples.
*
* @see org.apache.commons.sanselan.examples.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 final int[] MAGIC_NUMBERS_ICNS = { 0x69, 0x63, };
private static final int[] MAGIC_NUMBERS_DCX = { 0xB1, 0x68, };
private static final int[] MAGIC_NUMBERS_RGBE = { 0x23, 0x3F, };
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;
}
} else if (compareBytePair(MAGIC_NUMBERS_ICNS, bytePair)) {
return ImageFormat.IMAGE_FORMAT_ICNS;
} else if (compareBytePair(MAGIC_NUMBERS_DCX, bytePair)) {
return ImageFormat.IMAGE_FORMAT_DCX;
} else if (compareBytePair(MAGIC_NUMBERS_RGBE, bytePair)) {
return ImageFormat.IMAGE_FORMAT_RGBE;
}
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 List<BufferedImage> 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 List<BufferedImage> 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 List<BufferedImage> getAllBufferedImages(File file)
throws ImageReadException, IOException {
return getAllBufferedImages(new ByteSourceFile(file));
}
private static List<BufferedImage> 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;
}
throw new ImageWriteException("Unknown Format: " + format);
}
}