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 to share
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.
-1
source to share