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

白昼怎懂夜的黑 提交于 2019-12-05 19:02:49

问题


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);
  }
 }

}

回答1:


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.



来源:https://stackoverflow.com/questions/2744909/java-detecting-image-format-resize-scale-and-save-as-jpeg

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!