java - Girando instancias de BufferedImage
swing rotation (3)
Estás girando los gráficos para dibujar en tu imagen, no en la imagen. Es por eso que no ves ningún efecto. Aplique la rotación a los gráficos que está pintando y dibujará la imagen girada:
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
g.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
g.drawImage(img, imgx, imgy, null);
this.repaint();
}
Probablemente esto no dibujará completamente lo que espera, la rotación girará alrededor del origen de las coordenadas. Para que la imagen gire alrededor de su centro, debe aplicar una traducción de coordenadas antes de la rotación, por ejemplo:
g.translate(imgx >> 1, imgy >> 1);
El tutorial Graphics2D tiene algunos ejemplos más.
Estoy teniendo problemas para obtener una BufferedImage
rotada para mostrar. Creo que la rotación está funcionando bien, pero no puedo dibujarla en la pantalla. Mi código:
Class extends JPanel {
BufferedImage img;
int rotation = 0;
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
img2d = img.createGraphics();
img2d.rotate(Math.toRadians(rotation), img.getWidth() / 2, img.getHeight() / 2);
g.drawImage(img, imgx, imgy, null);
this.repaint();
}
}
Esto no está funcionando para mí. No pude encontrar ninguna forma de dibujar el img2d
girado en g
.
EDITAR: Tengo varios objetos que se están dibujando en g
, así que no puedo rotarlos. Necesito poder rotar las cosas individualmente.
Tal vez deberías intentar usar AffineTransform
esta manera:
AffineTransform transform = new AffineTransform();
transform.rotate(radians, bufferedImage.getWidth()/2, bufferedImage.getHeight()/2);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
bufferedImage = op.filter(bufferedImage, null);
Espero que esto ayude.
Yo usaría Graphics2D.drawImage (image, affinetranform, imageobserver) .
El siguiente ejemplo de código gira y traduce una imagen al centro del componente. Esta es una captura de pantalla del resultado:
public static void main(String[] args) throws IOException {
JFrame frame = new JFrame("Test");
frame.add(new JComponent() {
BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// create the transform, note that the transformations happen
// in reversed order (so check them backwards)
AffineTransform at = new AffineTransform();
// 4. translate it to the center of the component
at.translate(getWidth() / 2, getHeight() / 2);
// 3. do the actual rotation
at.rotate(Math.PI/4);
// 2. just a scale because this image is big
at.scale(0.5, 0.5);
// 1. translate the object so that you rotate it around the
// center (easier :))
at.translate(-image.getWidth()/2, -image.getHeight()/2);
// draw the image
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(image, at, null);
// continue drawing other stuff (non-transformed)
//...
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}