How to resize and rotate an image

I want to rotate the image and on the next level I want to resize it. Help me. I am creating a class that has been extended from JPanel and overrides the paintComponent () method to paint an image.

public class NewJPanel extends javax.swing.JPanel {

/** Creates new form NewJPanel */
public NewJPanel() {
    initComponents();
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 20, 20, this);
}

      

0


source to share


3 answers


This is the code I am using. You can change it according to your needs.

Resize image:


/**
     * Resizes the image
     * @param filePath File path to the image to resize
     * @param w Width of the image
     * @param h Height of the image
     * @return A resized image
     */
     public ImageIcon resizeImage(String filePath, int w, int h) {


        String data = filePath;
        BufferedImage bsrc, bdest;
        ImageIcon theIcon;
        //scale the image
        try
        {
            if(dataSource == DataTypeEnum.file)
            {
                bsrc = ImageIO.read(new File(data));
            }
            else
            {
                bsrc = ImageIO.read(new URL(filePath));
            }
            bdest = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bdest.createGraphics();
            AffineTransform at = AffineTransform.getScaleInstance((double) w / bsrc.getWidth(),
                    (double) h / bsrc.getHeight());
            g.drawRenderedImage(bsrc, at);

            //add the scaled image
            theIcon = new ImageIcon(bdest);
            return theIcon;
        }
        catch (Exception e)
        {
            Window.getLogger().warning("This image can not be resized. Please check the path and type of file.");
            //restore the old background
            return null;
        }

     }

      



Rotate image:
NOTE. The angle is in radians.


public static BufferedImage rotate(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth(), h = image.getHeight();
    int neww = (int)Math.floor(w*cos+h*sin), newh = (int)Math.floor(h*cos+w*sin);
    GraphicsConfiguration gc = getDefaultConfiguration();
    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT);
    Graphics2D g = result.createGraphics();
    g.translate((neww-w)/2, (newh-h)/2);
    g.rotate(angle, w/2, h/2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}


      

+3


source


Without providing a complete solution



Graphics2D has rotate and scale .

0


source


Use BufferedImage class

BufferedImage newImg = new BufferedImage (newWidth, newHeight, imageType); newImg.createGraphics (). drawImage (oldImg, 0,0, newWidth, newHeight, 0,0, oldWidth, oldHeight, null);

then just redraw with newImg instead of the old image, should work, I'm not near the compiler at the moment to check.

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#drawImage%28java.awt.Image,%20int,%20int,%20int,%20int,%20int ,% 20int,% 20int,% 20int,% 20java.awt.image.ImageObserver% 29

-1


source







All Articles