PDA

Ver la versión completa : Sobre swing y awt e imagenes



Rebnuk
18-02-2008, 17:17
Hola a todos.

Estoy haciendo un proyecto en la universidad con java con el eclipse utilizando los paquetes swing y awt.

Vereis en este proyecto tengo que insertar imagenes y bueno para esto he creao un jLabel y simplemente le he pasao la imagen como ImageIcon a la constructora y asi aparece bien la imagen. Pero el problema que tengo es que ahora necesito rotar la imagen y he buscao entre lo metodos de la clase ImageIcon o Image o Graphics y nada y como que estoy bloqueao con esto.

A ver si alguien a tenido alguna experiencia parecida con esto y como lo ha podido implementar.

Muchas Gracias.

hystd
19-02-2008, 22:14
Buenas! Lo que estás buscando es realizar una transformación afín (rotación) sobre una imagen. La imagen rotada será una versión transformada de la imagen fuente. Te digo ésto porque es distinto aplicar una transformación a un objeto Graphics2D y después renderizarlo, a ésto.

Bueno creo que no me voy a extender demasiado... Sólo comentarte brevemente el procedimiento: Cargamos la imagen en un Stream, Suponiendo que la imagen a cargar sea JPEG, usaremos la clase JPEGImageDecoder y BufferedImage, si no, siempre puedes llamar al método estático de la clase ToolKit: Toolkit.getDefaultToolkit().getImage("la_imagen.jpg");. A continuación creas un objeto AffineTransform, para llamar al método que rotará la imagen el ángulo que le indiquemos. Creas un objeto RenderingHints para indicar qué algoritmo vamos a usar para la aproximación del color de cada pixel, en este caso "bilineal". Nos queda convertir a un objeto AffineTransformOp, para ello lo creamos pasándole como parámetro al constructor el objeto AffineTransform, y por último sólo nos queda dibujarlo... llamando al método drawImage del objeto Graphics2D:


public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
try {
InputStream in = getClass().getResourceAsStream("la_imagen.jpg");
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
BufferedImage image = decoder.decodeAsBufferedImage();
// Aqui se realiza la transformación (rotación de 45 grados en sentido horario, por ejemplo)
AffineTransform at = AffineTransform.getRotateInstance(Math.PI/4);
RenderingHints rh = new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
AffineTransformOp atop = new AffineTransformOp(at,rh);
BufferedImage destino = atop.filter(image, null);

g2.drawImage(destino,0,20,this);
in.close();
}
catch (IOException e) {e.printStackTrace();}
catch (ImageFormatException e) {e.printStackTrace();}
}

Rebnuk
20-02-2008, 20:10
Muchas gracias por contestar.

Hoy lo he implementado en clase y funciona pero no he utilizado exactamente ese algoritmo. He utlizado este que he encontrado.

public ImageIcon rotateIcon(ImageIcon icon, int angle) {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
int type = BufferedImage.TYPE_INT_RGB; // other options, see api
BufferedImage image = new BufferedImage(h, w, type);
Graphics2D g2 = image.createGraphics();
double x = (h - w) / 2.0;
double y = (w - h) / 2.0;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
at.rotate(Math.toRadians(angle), w / 2.0, h / 2.0);
g2.drawImage(icon.getImage(), at, this);
g2.dispose();
return icon = new ImageIcon(image);
}

Este me ha servido a la primera ya que al devolver un ImageIcon simplemente le hacia un setIcon() al Jlabel con la imagen que devuelve esta funcion. En la que tu me pones no entiendo bien el parametro de g que hay que pasarle. Es que no tengo mucha experiencia con estos paquetes de java.

Muchas gracias.