Java Rotate and Scale an Image

 private void imageRotateScale(String imageFilePath, String outImagePath) {

  File input = new File(imageFilePath);
  File output = new File(outImagePath);
  BufferedImage bufferedImage;

  try {
   bufferedImage = ImageIO.read(input);
   //Create a blank, RGB, same width and height, and a white background
   BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(),
     bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
   newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);
   //Scale the Image by half, Change 0.5 to Whatever Value you want it to Shrink
   newBufferedImage = scale(newBufferedImage, (int) Math.round(bufferedImage.getWidth() * 0.5), (int) Math.round(bufferedImage.getHeight() * 0.5));

   //Time to Rotate the Image
   int w = newBufferedImage.getWidth();
   int h = newBufferedImage.getHeight();
   AffineTransform scaleTransform = new AffineTransform();
   scaleTransform.translate(h/2,w/2);
   scaleTransform.rotate(-1 * (Math.PI / 2));
   scaleTransform.translate(-w/2,-h/2);
   AffineTransformOp scaleOp = new AffineTransformOp(
     scaleTransform, AffineTransformOp.TYPE_BILINEAR);
   newBufferedImage = scaleOp.filter(newBufferedImage, null);

   //Write the output Image file
   ImageIO.write(newBufferedImage, "jpg", output);

  } catch (IOException e) {
   e.printStackTrace(); 
  }  

 }


 private BufferedImage scale(BufferedImage image, int targetWidth, int targetHeight) {

  int type = (image.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
  BufferedImage newImage = image;
  BufferedImage scratchImage = null;
  Graphics2D g2 = null;

  int w = image.getWidth();
  int h = image.getHeight();

  int prevW = w;
  int prevH = h;

  do {
   if (w > targetWidth) {
    w /= 2;
    w = (w < targetWidth) ? targetWidth : w;
   }

   if (h > targetHeight) {
    h /= 2;
    h = (h < targetHeight) ? targetHeight : h;
   }

   if (scratchImage == null) {
    scratchImage = new BufferedImage(w, h, type);
    g2 = scratchImage.createGraphics();
   }

   g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
   g2.drawImage(newImage, 0, 0, w, h, 0, 0, prevW, prevH, null);

   prevW = w;
   prevH = h;
   newImage = scratchImage;
  } while (w != targetWidth || h != targetHeight);

  if (g2 != null) {
   g2.dispose();
  }

  if (targetWidth != newImage.getWidth() || targetHeight != newImage.getHeight()) {
   scratchImage = new BufferedImage(targetWidth, targetHeight, type);
   g2 = scratchImage.createGraphics();
   g2.drawImage(newImage, 0, 0, null);
   g2.dispose();
   newImage = scratchImage;
  }

  return newImage;

 }

No comments:

Post a Comment

NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.