Pregunta

Te gustaría saber si hay una manera de crear una ImageIcon que es el espejo del otro ImageIcon.

La búsqueda en Google, encontré cómo hacerlo mediante el uso de muchas bibliotecas AWT.

¿Hay una manera de hacerlo con Swing? Si no es así, todavía estoy teniendo problemas con el método AWT:

El ImageIcon Quiero espejo es un gif animado (con contener un color transparente) y el método AWT devuelve un no transparente (el color transparente se cambia a negro opaco) y gif no animado.

¿Alguna idea de cómo mantener la animación y el color transparente?

Este es el código AWT que encontré (rangerStand ser el ImageIcon el original):

 Image reversed = rangerStand.getImage();
 BufferedImage bufferedImage = new BufferedImage(reversed.getWidth(null), reversed.getHeight(null), BufferedImage.TYPE_INT_RGB);
 Graphics gb = bufferedImage.getGraphics();
 gb.drawImage(reversed, 0, 0, null);
 gb.dispose();

 AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
 tx.translate(-reversed.getWidth(null), 0);
 AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
 bufferedImage = op.filter(bufferedImage, null);
 ImageIcon lol = new ImageIcon(bufferedImage);
 this.sprite.setIcon(lol);

Gracias por la lectura.

¿Fue útil?

Solución

Es posible que desee para tratar de crear subclases de la clase ImageIcon y pintar la imagen invertida. Prueba este pedazo de código, se puede hacer el truco (no he probado con gif animado transparente pero debería funcionar):

EDIT: I ligeramente cambiado el código y probado con un gif animado. Funciona!

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


/**
 * @author Savvas Dalkitsis
 */
public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame("Test");
        JLabel l = new JLabel();
        ImageIcon io = new MirrorImageIcon("test.gif");
        l.setIcon(io);
        f.getContentPane().add(l);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

}

@SuppressWarnings("serial")
class MirrorImageIcon extends ImageIcon {

    public MirrorImageIcon(String filename) {
        super(filename);
    }

    @Override
    public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2 = (Graphics2D)g.create();
        g2.translate(getIconWidth(), 0);
        g2.scale(-1, 1);
        super.paintIcon(c, g2, x, y);
    }

}

Otros consejos

No tengo idea de cómo resolver el problema con Swing o AWT nativa - a pesar de Java soporta 89a con la transparencia y la animación. Supongo, hay que descomprimir el GIF89a, reflejar las imágenes de animación, uno por uno, y recargando. Hay al menos una biblioteca que podría darle una oportunidad: gif4j luz

En primer lugar, el soporte de imágenes en la oscilación se basa en AWT, por lo que "hacerlo con Swing" no tiene mucho sentido.

A excepción de eso, usted tiene dos problemas: Mantener la transparencia y el mantenimiento de la animación. La primera cuestión es simple de resolver. Con BufferedImage.TYPE_INT_RGB, que está creando un nuevo BufferedImage sin un canal alfa (transparencia informativa). Si cambia el tipo de BufferedImage.TYPE_INT_ARGB, esta cuestión debe ser fijo.

El bit de animación es un poco más difícil. Una imagen o un BufferedImage en realidad no apoyan la animación, pero utilizando un GIF animado como fuente y la visualización de la imagen en un componente de interfaz gráfica de usuario hace que un tipo de interacción no divulgada entre la imagen y el componente de interfaz gráfica de usuario, haciendo que la animación que se muestra. La forma de copiar la imagen original a un BufferedImage probablemente hará que el único marco, que se muestra en ese momento a ser copiado en el BufferedImage. Es más de dos líneas de código, pero se puede utilizar el ImageReader en javax.imageio para leer cada fotograma a fotograma de la animación GIF y ImageWriter para crear un nuevo archivo GIF animado a partir de las imágenes reflejadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top