Java Image Rotate rotateImage(Image inImage, int inMaxWidth, int inMaxHeight, int inRotationDegrees)

Here you can find the source of rotateImage(Image inImage, int inMaxWidth, int inMaxHeight, int inRotationDegrees)

Description

Create a new image by rotating and scaling the given one

License

Open Source License

Parameter

Parameter Description
inImage input image
inMaxWidth maximum width of output image
inMaxHeight maximum height of output image
inRotationDegrees number of degrees to rotate clockwise (0, 90, 180 or 270)

Return

rotated, scaled image

Declaration

public static BufferedImage rotateImage(Image inImage, int inMaxWidth, int inMaxHeight, int inRotationDegrees) 

Method Source Code


//package com.java2s;
//License from project: Open Source License 

import java.awt.Dimension;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;

public class Main {
    /**/* w ww .j a v  a  2  s.c  o m*/
     * Create a new image by rotating and scaling the given one
     * @param inImage input image
     * @param inMaxWidth maximum width of output image
     * @param inMaxHeight maximum height of output image
     * @param inRotationDegrees number of degrees to rotate clockwise (0, 90, 180 or 270)
     * @return rotated, scaled image
     */
    public static BufferedImage rotateImage(Image inImage, int inMaxWidth, int inMaxHeight, int inRotationDegrees) {
        // Create scaled image of suitable size
        boolean isRotated = (inRotationDegrees % 180 != 0);
        int origWidth = inImage.getWidth(null);
        int origHeight = inImage.getHeight(null);
        int thumbWidth = isRotated ? origHeight : origWidth;
        int thumbHeight = isRotated ? origWidth : origHeight;
        Dimension scaledSize = getThumbnailSize(thumbWidth, thumbHeight, inMaxWidth, inMaxHeight);
        BufferedImage result = new BufferedImage(scaledSize.width, scaledSize.height, BufferedImage.TYPE_INT_RGB);
        // Do different things according to rotation angle (a bit messy, sorry!)
        if (inRotationDegrees == 0) {
            // Not rotated, so just copy image directly
            result.getGraphics().drawImage(inImage, 0, 0, scaledSize.width, scaledSize.height, null);
        } else {
            // Need to use Graphics2D for rotation, not Graphics
            Graphics2D g2d = result.createGraphics();
            switch (inRotationDegrees) {
            case 90:
                g2d.rotate(Math.PI / 2, 0.0, 0.0);
                g2d.drawImage(inImage, 0, -scaledSize.width, scaledSize.height, scaledSize.width, null);
                break;
            case 180:
                g2d.rotate(Math.PI, scaledSize.width / 2.0, scaledSize.height / 2.0);
                g2d.drawImage(inImage, 0, 0, scaledSize.width, scaledSize.height, null);
                break;
            case 270:
                g2d.rotate(Math.PI * 3 / 2, 0.0, 0.0);
                g2d.drawImage(inImage, -scaledSize.height, 0, scaledSize.height, scaledSize.width, null);
            }
            // Clear up memory
            g2d.dispose();
        }
        return result;
    }

    /**
     * Work out the max size of a thumbnail
     * @param inOrigWidth width of original picture
     * @param inOrigHeight height of original picture
     * @param inMaxWidth max width of thumbnail
     * @param inMaxHeight max height of thumbnail
     * @return size of thumbnail as Dimension
     */
    public static Dimension getThumbnailSize(int inOrigWidth, int inOrigHeight, int inMaxWidth, int inMaxHeight) {
        if (inMaxWidth <= 0 || inMaxHeight <= 0) {
            return new Dimension(1, 1);
        }
        // work out maximum zoom ratio available so that thumbnail isn't too big
        double xZoom = inMaxWidth * 1.0 / inOrigWidth;
        double yZoom = inMaxHeight * 1.0 / inOrigHeight;
        double zoom = (xZoom > yZoom ? yZoom : xZoom);
        // Don't make thumbnail bigger than picture
        if (zoom > 1.0) {
            return new Dimension(inOrigWidth, inOrigHeight);
        }

        // calculate new width and height
        final int xSize = (int) (zoom * inOrigWidth);
        final int ySize = (int) (zoom * inOrigHeight);
        if (xSize <= 0 || ySize <= 0) {
            return new Dimension(1, 1);
        }
        return new Dimension(xSize, ySize);
    }
}

Related

  1. rotate(Image img, double angle)
  2. rotate(Image img, float radian)
  3. Rotate(Image src, int angel)
  4. rotateImage(final File imagePath, int numquadrants)
  5. rotateImage(final Image img, final Point location, final double degrees)
  6. rotateImage(Image originalImage, double theta)
  7. rotateImage(String img_fn, int orient, String dest_fn)