package net.coobird.thumbnailator; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import net.coobird.thumbnailator.filters.ImageFilter; import net.coobird.thumbnailator.resizers.FixedResizerFactory; import net.coobird.thumbnailator.geometry.Region; import net.coobird.thumbnailator.resizers.Resizer; import net.coobird.thumbnailator.resizers.ResizerFactory; /** * This class is used to specify the parameters to use when creating a thumbnail. *
* An instance of {@link ThumbnailParameter} is mutable -- it should not be * reused for multiple resizes, as the parameters can change behind the scenes * as the resizing process progresses. * * @author coobird * */ public class ThumbnailParameter { /** * A constant used to denote that the output format of the thumbnail should * be the same as the format of the original image. */ public static final String ORIGINAL_FORMAT = null; /** * A constant used to denote that the output format of the thumbnail should * be the determined from available information such as the file name of * the thumbnail. *
* If a suitable output format cannot be determined, then the implementation * should behave as if {@link #ORIGINAL_FORMAT} was specified. */ public static final String DETERMINE_FORMAT = "\0"; /** * A constant used to denote that the output format type of the thumbnail * should be the default type of the codec being used. */ public static final String DEFAULT_FORMAT_TYPE = null; /** * A constant used to denote that the default compression quality settings * should be used when creating the thumbnail. */ public static final float DEFAULT_QUALITY = Float.NaN; /** * A constant used to denote that the image type of the original image * should be used when creating the thumbnail. */ public static final int ORIGINAL_IMAGE_TYPE = -1; /** * A constant used to denote that the default image type should be used * when creating the thumbnail. */ public static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB; /** * The thumbnail size. *
* If this field is set, then the {@link #scalingFactor} field will be set * as {@link Double#NaN} to indicate that it is not set. */ private final Dimension thumbnailSize; /** * The scaling factor to apply to the width when creating a thumbnail from * the original image. *
* If this field is set, then the {@link #thumbnailSize} field will be set * as {@code null} to indicate that it is not set. */ private final double widthScalingFactor; /** * The scaling factor to apply to the height when creating a thumbnail from * the original image. *
* If this field is set, then the {@link #thumbnailSize} field will be set * as {@code null} to indicate that it is not set. */ private final double heightScalingFactor; /** * Indicated whether or not the thumbnail should retain the aspect ratio * the same as the original image when the aspect ratio of the desired * dimensions for the thumbnail does not match the ratio of the original * image. */ private final boolean keepAspectRatio; /** * The output format for the thumbnail. *
* A value of {@link ThumbnailParameter#ORIGINAL_FORMAT} indicates that the * image format of the original image should be used as the output format. *
* A value of {@link ThumbnailParameter#DETERMINE_FORMAT} indicates that the * output format of the thumbnail should be the determined from the * information available, such as the output file name of the thumbnail. */ private final String outputFormat; /** * The output format type for the thumbnail. *
* A value of {@link ThumbnailParameter#DEFAULT_FORMAT_TYPE} indicates * that the default type of the specified compression format should be used * as the output format type. */ private final String outputFormatType; /** * The output quality settings which will be used by the image compressor. *
* An acceptable value is in the range of {@code 0.0f} to {@code 1.0f}, * where {@code 0.0f} is for the lowest quality setting and {@code 1.0f} for * the highest quality setting. *
* A value of {@link Float#NaN} indicates that the default quality settings * of the output codec should be used. */ private final float outputQuality; /** * The image type of the {@code BufferedImage} used for the thumbnail. */ private final int imageType; /** * {@link ImageFilter}s to apply to the thumbnail. *
* The filters will be applied after the original image has been resized.
*/
private final List
* A value of {@code null} represents that the entire source image should
* be used to create the thumbnail.
*/
private final Region sourceRegion;
/**
* Whether or not to fit the thumbnail within the specified dimensions.
*
* If {@code true} is specified, then the thumbnail will be sized to fit
* within the specified dimensions, if the thumbnail is going to exceed
* those dimensions.
*/
private final boolean fitWithinDimensions;
/**
* Whether or not to use the Exif orientation metadata to orient the
* thumbnails.
*/
private final boolean useExifOrientation;
/**
* Private constructor which sets all the required fields, and performs
* validation of the given arguments.
*
* This constructor is to be called from all the public constructors.
*
* @param thumbnailSize The size of the thumbnail to generate.
* @param widthScalingFactor The scaling factor to apply to the width
* when creating a thumbnail from the original
* image.
* @param heightScalingFactor The scaling factor to apply to the height
* when creating a thumbnail from the original
* image.
* @param sourceRegion The region of the source image to use when
* creating a thumbnail.
* A value of {@code null} indicates that the
* entire source image should be used to create
* the thumbnail.
* @param keepAspectRatio Indicates whether or not the thumbnail should
* maintain the aspect ratio of the original image.
* @param outputFormat A string indicating the compression format
* that should be applied on the thumbnail.
* A value of
* {@link ThumbnailParameter#ORIGINAL_FORMAT}
* should be provided if the same image format as
* the original should be used for the thumbnail.
* A value of
* {@link ThumbnailParameter#DETERMINE_FORMAT}
* should be provided if the output format of the
* thumbnail should be the determined from the
* information available, such as the output file
* name of the thumbnail.
* @param outputFormatType A string indicating the compression type that
* should be used when writing the thumbnail.
* A value of
* {@link ThumbnailParameter#DEFAULT_FORMAT_TYPE}
* should be provided if the thumbnail should be
* written using the default compression type of
* the codec specified in {@code outputFormat}.
* @param outputQuality A value from {@code 0.0f} to {@code 1.0f} which
* indicates the quality setting to use for the
* compression of the thumbnail. {@code 0.0f}
* indicates the lowest quality, {@code 1.0f}
* indicates the highest quality setting for the
* compression.
* {@link ThumbnailParameter#DEFAULT_QUALITY}
* should be specified when the codec's default
* compression quality settings should be used.
* @param imageType The {@link BufferedImage} image type of the
* thumbnail.
* A value of
* {@link ThumbnailParameter#DEFAULT_IMAGE_TYPE}
* should be specified when the default image
* type should be used when creating the thumbnail.
* @param filters The {@link ImageFilter}s to apply to the
* thumbnail.
* A value of {@code null} will be recognized as
* no filters are to be applied.
* The filters are applied after the original
* image has been resized.
* @param resizerFactory The {@link ResizerFactory} for obtaining a
* {@link Resizer} that is to be used when
* performing an image resizing operation.
* @param fitWithinDimensions Whether or not to fit the thumbnail within
* the specified dimensions.
*
* If {@code true} is specified, then the
* thumbnail will be sized to fit within the
* specified dimensions, if the thumbnail is
* going to exceed those dimensions.
* @param useExifOrientation Whether or not to use the Exif metadata to
* determine the orientation of the thumbnail.
*
* If {@code true} is specified, then the
* Exif metadata will be used to determine
* the orientation of the thumbnail.
*
* @throws IllegalArgumentException If the scaling factor is not a
* rational number or is less than or
* equal to 0, or if the
* {@link ResizerFactory} is null.
*/
private ThumbnailParameter(
Dimension thumbnailSize,
double widthScalingFactor,
double heightScalingFactor,
Region sourceRegion,
boolean keepAspectRatio,
String outputFormat,
String outputFormatType,
float outputQuality,
int imageType,
List
* If {@code true} is specified, then the
* thumbnail will be sized to fit within the
* specified dimensions, if the thumbnail is
* going to exceed those dimensions.
* @param useExifOrientation Whether or not to use the Exif metadata to
* determine the orientation of the thumbnail.
*
* If {@code true} is specified, then the
* Exif metadata will be used to determine
* the orientation of the thumbnail.
*
* @throws IllegalArgumentException If size is {@code null} or if the
* dimensions are negative, or if the
* {@link Resizer} is null.
* @since 0.4.3
*/
public ThumbnailParameter(
Dimension thumbnailSize,
Region sourceRegion,
boolean keepAspectRatio,
String outputFormat,
String outputFormatType,
float outputQuality,
int imageType,
List
* If {@code true} is specified, then the
* thumbnail will be sized to fit within the
* specified dimensions, if the thumbnail is
* going to exceed those dimensions.
* @param useExifOrientation Whether or not to use the Exif metadata to
* determine the orientation of the thumbnail.
*
* If {@code true} is specified, then the
* Exif metadata will be used to determine
* the orientation of the thumbnail.
*
* @throws IllegalArgumentException If the scaling factor is not a
* rational number or is less than or
* equal to 0, or if the
* {@link Resizer} is null.
* @since 0.4.3
*/
public ThumbnailParameter(
double widthScalingFactor,
double heightScalingFactor,
Region sourceRegion,
boolean keepAspectRatio,
String outputFormat,
String outputFormatType,
float outputQuality,
int imageType,
List
* If {@code true} is specified, then the
* thumbnail will be sized to fit within the
* specified dimensions, if the thumbnail is
* going to exceed those dimensions.
* @param useExifOrientation Whether or not to use the Exif metadata to
* determine the orientation of the thumbnail.
*
* If {@code true} is specified, then the
* Exif metadata will be used to determine
* the orientation of the thumbnail.
*
* @throws IllegalArgumentException If size is {@code null} or if the
* dimensions are negative, or if the
* {@link ResizerFactory} is null.
* @since 0.4.3
*/
public ThumbnailParameter(
Dimension thumbnailSize,
Region sourceRegion,
boolean keepAspectRatio,
String outputFormat,
String outputFormatType,
float outputQuality,
int imageType,
List
* If {@code true} is specified, then the
* thumbnail will be sized to fit within the
* specified dimensions, if the thumbnail is
* going to exceed those dimensions.
* @param useExifOrientation Whether or not to use the Exif metadata to
* determine the orientation of the thumbnail.
*
* If {@code true} is specified, then the
* Exif metadata will be used to determine
* the orientation of the thumbnail.
*
* @throws IllegalArgumentException If the scaling factor is not a
* rational number or is less than or
* equal to 0, or if the
* {@link ResizerFactory} is null.
* @since 0.4.3
*/
public ThumbnailParameter(
double widthScalingFactor,
double heightScalingFactor,
Region sourceRegion,
boolean keepAspectRatio,
String outputFormat,
String outputFormatType,
float outputQuality,
int imageType,
List
* Returns {@code null} if the scaling factor is set rather than the
* explicit thumbnail size.
*
* @return The size of the thumbnail.
*/
public Dimension getSize()
{
if (thumbnailSize != null)
{
return (Dimension)thumbnailSize.clone();
}
else
{
return null;
}
}
/**
* Returns the scaling factor to apply to the width when creating the
* thumbnail.
*
* Returns {@link Double#NaN} if the thumbnail size is set rather than the
* scaling factor.
*
* @return The width scaling factor for the thumbnail.
* @since 0.3.10
*/
public double getWidthScalingFactor()
{
return widthScalingFactor;
}
/**
* Returns the scaling factor to apply to the height when creating the
* thumbnail.
*
* Returns {@link Double#NaN} if the thumbnail size is set rather than the
* scaling factor.
*
* @return The height scaling factor for the thumbnail.
* @since 0.3.10
*/
public double getHeightScalingFactor()
{
return heightScalingFactor;
}
/**
* Returns the type of image. The value returned is the constant used for
* image types of {@link BufferedImage}.
*
* @return The type of the image.
*/
public int getType()
{
return imageType;
}
/**
* Returns whether or not the thumbnail is to maintain the aspect ratio of
* the source image when creating the thumbnail.
*
* @return {@code true} if the thumbnail is to maintain the aspect
* ratio of the original image, {@code false} otherwise.
*/
public boolean isKeepAspectRatio()
{
return keepAspectRatio;
}
/**
* Returns the output format for the thumbnail.
*
* If the output format is to use the same compression format as the
* original image, this method will return
* {@link ThumbnailParameter#ORIGINAL_FORMAT}.
*
* If the output format should be determined from the information available
* such as the file name of the thumbnail, then this method will return
* {@link ThumbnailParameter#DETERMINE_FORMAT}.
*
* @return The output format for the thumbnail.
*/
public String getOutputFormat()
{
return outputFormat;
}
/**
* Returns the output format type for the thumbnail.
*
* If the default compression type of the compression format is to be used,
* then this method will return
* {@link ThumbnailParameter#DEFAULT_FORMAT_TYPE}.
*
* @return The output format type for the thumbnail.
*/
public String getOutputFormatType()
{
return outputFormatType;
}
/**
* Returns the compression quality settings for the thumbnail.
*
* The value is in the range of {@code 0.0f} to {@code 1.0f},
* where {@code 0.0f} is for the lowest quality setting and {@code 1.0f} for
* the highest quality setting.
*
* If the default compression quality is to be used, then this method will
* return {@link ThumbnailParameter#DEFAULT_QUALITY}.
*
* @return The compression quality settings for the thumbnail.
*/
public float getOutputQuality()
{
return outputQuality;
}
/**
* Returns the list of {@link ImageFilter}s which are applied to the
* thumbnail.
*
* These filters are applied after the original image has been resized.
*
* @return The {@link ImageFilter}s which are applied to the thumbnail.
*/
public List
* A value of {@code null} indicates that the entire source
* image should be used to create the thumbnail.
*/
public Region getSourceRegion()
{
return sourceRegion;
}
/**
* Returns whether or not to fit the thumbnail within the specified
* dimensions.
*
* @return {@code true} is returned when the thumbnail should be sized
* to fit within the specified dimensions, if the thumbnail
* is going to exceed those dimensions.
* @since 0.4.0
*/
public boolean fitWithinDimenions()
{
return fitWithinDimensions;
}
/**
* Returns whether or not the Exif metadata should be used to determine
* the orientation of the thumbnail.
*
* @return {@code true} is returned when the Exif metadata should be
* used to decide the orientation of the thumbnail,
* {@code false} otherwise.
* @since 0.4.3
*/
public boolean useExifOrientation()
{
return useExifOrientation;
}
}