Java: Detecting image format, resize (scale) and save as JPEG

11,927

You can easily scale your image by using Image's getScaledInstance method:

BufferedImage img = ImageIO.read(new File("image.jpg"));
int scaleX = (int) (img.getWidth() * 0.5);
int scaleY = (int) (img.getHeight() * 0.5);

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);

Once you've obtained your scaled Image you can "convert" it back into a BufferedImage as described here.

Finally, use the ImageIO class to write your BufferedImage to a file.

Share:
11,927
BoDiE2003
Author by

BoDiE2003

Updated on July 20, 2022

Comments

  • BoDiE2003
    BoDiE2003 almost 2 years

    This is the code I have, it actually works, not perfectly but it does, the problem is that the resized thumbnails are not pasting on the white Drawn rectangle, breaking the images aspect ratio, here is the code, could someone suggest me a fix for it, please?

    Thank you

    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    public class ImageScalerImageIoImpl implements ImageScaler {
    
     private static final String OUTPUT_FORMAT_ID = "jpeg";
    
     // Re-scaling image
     public byte[] scaleImage(byte[] originalImage, int targetWidth,
       int targetHeight) {
    
      try {
       InputStream imageStream = new BufferedInputStream(
         new ByteArrayInputStream(originalImage));
       Image image = (Image) ImageIO.read(imageStream);
    
       int thumbWidth = targetWidth;
       int thumbHeight = targetHeight;
    
       // Make sure the aspect ratio is maintained, so the image is not skewed
             double thumbRatio = (double)thumbWidth / (double)thumbHeight;
             int imageWidth = image.getWidth(null);
             int imageHeight = image.getHeight(null);
             double imageRatio = (double)imageWidth / (double)imageHeight;
             if (thumbRatio < imageRatio) {
               thumbHeight = (int)(thumbWidth / imageRatio);
             } else {
               thumbWidth = (int)(thumbHeight * imageRatio);
             }
    
       // Draw the scaled image
       BufferedImage thumbImage = new BufferedImage(thumbWidth,
         thumbHeight, BufferedImage.TYPE_INT_RGB);
       System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight);
    
       Graphics2D graphics2D = thumbImage.createGraphics();
       // Use of BILNEAR filtering to enable smooth scaling
       graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
         RenderingHints.VALUE_INTERPOLATION_BILINEAR);
       // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
    
       // White Background
       graphics2D.setPaint(Color.WHITE);
       graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth,
         targetHeight));
       graphics2D.fillRect(0, 0, targetWidth, targetHeight);
    
       System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight);
    
       // insert the resized thumbnail between X and Y of the image 
       graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
    
       System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight);
    
       // Write the scaled image to the outputstream
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out);
       return out.toByteArray();
    
      } catch (IOException ioe) {
       throw new ImageResizingException(ioe);
      }
     }
    
    }
    
  • BoDiE2003
    BoDiE2003 about 14 years
    The scaling needs to be dynamic depending of the target Canvas container. Anyway, Ive solved it my self with a good refactoring and a couple of logic fixes. Thank you anyway
  • Karussell
    Karussell about 12 years
    link does not work. hints for Image to BufferedImage transformation?
  • Adamski
    Adamski about 12 years
    Which link doesn't work? I just tried them all and they seem ok.
  • jacobq
    jacobq over 10 years
    FYI: exampledepot.com/egs/java.awt.image/Image2Buf.html redirects to parked domain sites.
  • Bruce Edge
    Bruce Edge almost 10 years
    getScaledInstance may not be your best friend: today.java.net/pub/a/today/2007/04/03/…