Mediante AffineTransform se puede rotar una imagen dibujada sobre un Graphics.
Esto se debe a que en realidad AffineTransform agrega una transformada al objeto Graphipcs.
Para rotar se pasa a una instancia de AffineTransform a través de rotate(), pasándole el ángulo en radianes y el centro de rotación. Luego esta instancia se asigna al objeto Graphics (debemos asignársela a Graphics2D en realidad)
AffineTransform at = new AffineTransform(); at.rotate(r, 100, 100); //se asigna el angulo y centro de rotacion ((Graphics2D) g).setTransform(at);
Ejemplo
Por ejemplo creamos un panel que muestra un cuadrado girado una determinada cantidad de grados llamada JPanelImagenGiratoria.java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
public class JPanelImagenGiratoria extends javax.swing.JPanel {
private int grados = 0;
public int getGrados() {
return grados;
}
public void setGrados(int grados) {
this.grados = grados;
repaint();
}
@Override
public void paint(Graphics g) {
super.paint(g); //se borra el contenido anterior
double r = Math.toRadians(grados); //se convierte a radianes lo grados
AffineTransform at = new AffineTransform();
at.rotate(r, 100, 100); //se asigna el angulo y centro de rotacion
((Graphics2D) g).setTransform(at);
//se dibuja
g.setColor(Color.BLUE);
g.drawRect(50, 50, 100, 100);
}
}
y un frame para realizar la prueba del panel llamada PruebaPanel.java. Prestar atención al observador de cambios del JSlider agregado mediante addChangeListener():
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;
public class PruebaPanel{
public static void main(String[] args) {
final JFrame jf = new JFrame("Prueba Imagen Giratoria");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(200, 250);
final JPanelImagenGiratoria ig = new JPanelImagenGiratoria();
final JSlider js = new JSlider(0, 360);
js.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
ig.setGrados(js.getValue());
}
});
js.setValue(0);
jf.setLayout(new BorderLayout());
jf.add(ig, BorderLayout.CENTER);
jf.add(js, BorderLayout.SOUTH);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
Imágenes:


Más Info
Filed under: Java, Swing | 10 Comments
Tags: AffineTransform, imagen, Java, jdialog, JFrame
me re sirvio!!!!
muy buen articulo
Felicitaciones, excelente post.
Todavia espero un articulo tuyo en el JUG.
Sebas
Hola Le Funes,
esto es completamente offtopic, pero no encontraba otra forma de contactar contigo. ¿Has recibido el correo que te he enviado tú cuenta de gmail?
@Seba
Estoy puliendo los últimos detalles para mi primer articulo para el JUG (espero que no sea el último)
@Abraham
Ahí te conteste
Hola que tal, gracias por este tutorial me sirvió bastante para un trabajo que estoy haciendo de gráficos, tengo un pequeño problema, estoy haciendo un pequeño programa que dibuja un cuadrado, lo mueve de forma aleatoria, aumenta y disminuye de tamaño y además rota la imagen, pero me gustaría que rotara en la posición que queda… te mando la dirección si puedes checar a lo que me refiero y sugerir una solución … gracias por tu tiempo http://www.comboadictos.net/Mover_rotar.zip
@Mario revisá la parte en que le indicas que rote:
si en verdad lo que queres hacer es:
colocando el centro de rotación en el centro del cuadrado
Saludos
hola, me pregunto si se puede rotar una imagen de la mis ma manera desde un archivo?
@yarim si funciona exactamente igual, lo que cambia es lo que vos “dibujas” en el lienzo del panel.
Después del comentario que dice “//se dibuja” del panel JPanelImagenGiratoria en vez de dibujar un cuadrado:
dibujas la imagen :
Por supuesto que a la imagen la vá afectar el pixelado en mayor o menor medida
that`s good