package net.coobird.thumbnailator.makers; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import net.coobird.thumbnailator.builders.BufferedImageBuilder; import net.coobird.thumbnailator.resizers.FixedResizerFactory; import net.coobird.thumbnailator.resizers.Resizer; import net.coobird.thumbnailator.resizers.DefaultResizerFactory; import net.coobird.thumbnailator.resizers.ResizerFactory; /** * An abstract class which provides support functionalities for * {@link ThumbnailMaker} implementations. * * @author coobird * */ public abstract class ThumbnailMaker { /** * String used for an exception message. */ private static final String NOT_READY_FOR_MAKE = "Maker not ready to " + "make thumbnail."; /** * Used when determining whether the "imageType" parameter has been set * already or not. */ private static final String PARAM_IMAGE_TYPE = "imageType"; /** * Used when determining whether the "resizer" parameter has been set * already or not. */ private static final String PARAM_RESIZER = "resizer"; /** * Used when determining whether the "resizerFactory" parameter has been set * already or not. */ private static final String PARAM_RESIZERFACTORY = "resizerFactory"; /** * Class which keeps track of the parameters being set for the * {@link ThumbnailMaker}. *
* This class provides functionality to determine whether or not all the
* required parameters have been set or not.
*
* @author coobird
*
*/
protected final static class ReadinessTracker
{
private final Map
* By delaying the decision of picking the {@link Resizer} to use until
* when the thumbnail is to be created could lead to a more suitable
* {@link Resizer} being picked, as the dimensions for the source and
* destination images are known at that time.
*/
protected ResizerFactory resizerFactory;
/**
* Creates and initializes an instance of {@link ThumbnailMaker}.
*/
public ThumbnailMaker()
{
ready = new ReadinessTracker();
ready.unset(PARAM_IMAGE_TYPE);
ready.unset(PARAM_RESIZER);
ready.unset(PARAM_RESIZERFACTORY);
defaultImageType();
defaultResizerFactory();
}
/**
* Makes a thumbnail.
*
* @param img The source image.
* @return The thumbnail created from the source image, using the
* parameters set by the {@link ThumbnailMaker}.
*/
public abstract BufferedImage make(BufferedImage img);
/**
* Makes a thumbnail of the specified dimensions, from the specified
* source image.
*
* @param img The source image.
* @param width The target width of the thumbnail.
* @param height The target height of the thumbnail.
* @return The thumbnail image.
* @throws IllegalStateException If the {@code ThumbnailMaker} is
* not ready to create thumbnails.
* @throws IllegalArgumentException If the width and/or height is less
* than or equal to zero.
*/
protected BufferedImage makeThumbnail(
BufferedImage img,
int width,
int height
)
{
if (!ready.isReady())
{
throw new IllegalStateException(ThumbnailMaker.NOT_READY_FOR_MAKE);
}
if (width <= 0)
{
throw new IllegalArgumentException(
"Width must be greater than zero."
);
}
if (height <= 0)
{
throw new IllegalArgumentException(
"Height must be greater than zero."
);
}
BufferedImage thumbnailImage =
new BufferedImageBuilder(width, height, imageType).build();
Dimension imgSize = new Dimension(img.getWidth(), img.getHeight());
Dimension thumbnailSize = new Dimension(width, height);
Resizer resizer = resizerFactory.getResizer(imgSize, thumbnailSize);
resizer.resize(img, thumbnailImage);
return thumbnailImage;
}
/**
* Sets the type for the {@link BufferedImage} to produce.
*
* @param imageType The type of the {@code BufferedImage}.
* @return A reference to this object.
*/
public ThumbnailMaker imageType(int imageType)
{
this.imageType = imageType;
ready.set(PARAM_IMAGE_TYPE);
return this;
}
/**
* Sets the type of the {@link BufferedImage} to be the default type.
*
* @return A reference to this object.
*/
public ThumbnailMaker defaultImageType()
{
return imageType(DEFAULT_IMAGE_TYPE);
}
/**
* Sets the {@link Resizer} which is used for the resizing operation.
*
* @param resizer The {@link Resizer} to use when resizing the image
* to create the thumbnail.
* @return A reference to this object.
*/
public ThumbnailMaker resizer(Resizer resizer)
{
this.resizerFactory = new FixedResizerFactory(resizer);
ready.set(PARAM_RESIZER);
ready.set(PARAM_RESIZERFACTORY);
return this;
}
/**
* Sets the {@link Resizer} to use the default {@link Resizer}.
*
* @return A reference to this object.
*/
public ThumbnailMaker defaultResizer()
{
return defaultResizerFactory();
}
/**
* Sets the {@link ResizerFactory} which is used to obtain a {@link Resizer}
* for the resizing operation.
*
* @param resizerFactory The {@link ResizerFactory} to obtain the
* {@link Resizer} used when resizing the image
* to create the thumbnail.
* @return A reference to this object.
* @since 0.4.0
*/
public ThumbnailMaker resizerFactory(ResizerFactory resizerFactory)
{
this.resizerFactory = resizerFactory;
ready.set(PARAM_RESIZER);
ready.set(PARAM_RESIZERFACTORY);
return this;
}
/**
* Sets the {@link ResizerFactory} to use {@link DefaultResizerFactory}.
*
* @return A reference to this object.
* @since 0.4.0
*/
public ThumbnailMaker defaultResizerFactory()
{
this.resizerFactory = DefaultResizerFactory.getInstance();
ready.set(PARAM_RESIZER);
ready.set(PARAM_RESIZERFACTORY);
return this;
}
}