|
Written by Charles
|
|
Wednesday, 10 December 2008 09:27 |
|
This is an approach to scaling an image in Java without the distortion that come from changing the aspect ratio. The source code is HERE import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage;
public class ImageScaler { /** * Scale an image while preserving aspect ratio * * @param args Name of image file to be scaled (testing only) * */ public static void main(String[] args) throws Exception { BufferedImage in = javax.imageio.ImageIO.read(new java.io.File(args[0])); BufferedImage out = ImageScaler.scaleImage(in, BufferedImage.TYPE_INT_RGB, 100, 200); javax.imageio.ImageIO.write(out, "JPG", new java.io.File("scaled.jpg")); }
/** * * @param image The image to be scaled * @param imageType Target image type, e.g. TYPE_INT_RGB * @param newWidth The required width * @param newHeight The required width * * @return The scaled image */ public static BufferedImage scaleImage(BufferedImage image, int imageType, int newWidth, int newHeight) { // Make sure the aspect ratio is maintained, so the image is not distorted double thumbRatio = (double) newWidth / (double) newHeight; int imageWidth = image.getWidth(null); int imageHeight = image.getHeight(null); double aspectRatio = (double) imageWidth / (double) imageHeight;
if (thumbRatio < aspectRatio) { newHeight = (int) (newWidth / aspectRatio); } else { newWidth = (int) (newHeight * aspectRatio); }
// Draw the scaled image BufferedImage newImage = new BufferedImage(newWidth, newHeight, imageType); Graphics2D graphics2D = newImage.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(image, 0, 0, newWidth, newHeight, null);
return newImage; } }
|