package alien4cloud.utils;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
/**
* Utility to resize images.
*
* @author luc boutier
*/
public final class ImageResizeUtil {
private ImageResizeUtil() {
}
/**
* Resize an image with default quality settings.
*
* @param originalImage The image to resize.
* @param width The target width.
* @param height The target height.
* @param preserveDimensions Flag to know if we should preserve original image dimensions.
* @return The resized image.
*/
public static BufferedImage resizeImage(final BufferedImage originalImage, final int width, final int height,
final boolean preserveDimensions) {
return resizeImage(originalImage, width, height, preserveDimensions, false);
}
/**
* <p>
* Resize an image with high quality settings.
* </p>
* <ul>
* <li>g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);</li>
* <li>g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);</li>
* <li>g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);</li>
* </ul>
*
* @param originalImage The image to resize.
* @param width The target width.
* @param height The target height.
* @param preserveDimensions Flag to know if we should preserve original image dimensions.
* @return The resized image.
*/
public static BufferedImage resizeImageWithHint(BufferedImage originalImage, final int width, final int height,
final boolean preserveDimensions) {
return resizeImage(originalImage, width, height, preserveDimensions, true);
}
private static BufferedImage resizeImage(BufferedImage originalImage, final int width, final int height,
final boolean preserveDimensions, final boolean enableHighQuality) {
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
int targetWidth = width;
int targetHeight = height;
if (preserveDimensions) {
int[] targetDimentions = computeDimensions(width, height, originalImage.getWidth(), originalImage.getHeight());
targetWidth = targetDimentions[0];
targetHeight = targetDimentions[1];
}
BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, type);
Graphics2D g = resizedImage.createGraphics();
if (enableHighQuality) {
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
g.drawImage(originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH), 0, 0, null);
g.dispose();
return resizedImage;
}
/**
* Compute target width and height based on requested width and height but making sure the original dimensions of the image will be preserved.
*
* @param width The ideal (and max) target width.
* @param height The ideal (and max) target height.
* @param originalWidth The original width.
* @param originalHeight The original height.
* @return An array of int that contains the ideal width and height to preserve dimensions.
*/
public static int[] computeDimensions(final int width, final int height, final int originalWidth, final int originalHeight) {
int targetWidth = width;
int targetHeight = height;
float targetDimensions = Float.valueOf(width).floatValue() / Float.valueOf(height).floatValue();
float sourceDimensions = Float.valueOf(originalWidth).floatValue() / Float.valueOf(originalHeight).floatValue();
if (targetDimensions > sourceDimensions) {
targetWidth = Float.valueOf(width * sourceDimensions / targetDimensions).intValue();
} else {
targetHeight = Float.valueOf(height * targetDimensions / sourceDimensions).intValue();
}
return new int[] { targetWidth, targetHeight };
}
}