Criar um ImageIcon que é o espelho da outra
Pergunta
Eu gostaria de saber se existe uma maneira de criar um ImageIcon que é o espelho da outra ImageIcon.
Como pesquisar no Google, descobri como fazê-lo usando muitas bibliotecas AWT.
Existe uma maneira de fazê-lo com Swing? Se não, eu ainda estou tendo problemas com o método AWT:
O ImageIcon Quero espelho é um gif animado (com conter uma cor transparente) eo método AWT retorna um não-transparente (a cor transparente é alterado para preto opaco) e GIF não animado.
Todas as idéias como manter a animação ea cor transparente?
Aqui está o código AWT eu encontrei (rangerStand sendo o ImageIcon 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);
Obrigado por leitura.
Solução
Você pode querer experimentar e subclasse da classe ImageIcon e pintar a imagem invertida. Tente este pedaço de código, ele pode fazer o truque (eu não tentei com gif transparente animado, mas ele deve funcionar):
EDIT: Eu ligeiramente alterado o código e testei com um GIF animado. Ele 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);
}
}
Outras dicas
Sem idéia de como resolver o problema com balanço nativa ou AWT - embora Java suporta GIF89a com transparência e animação. Eu acho que, você tem que descompactar o GIF89a, espelhar as imagens de animação, um por um e repack. Há pelo menos uma biblioteca que você poderia dar uma tentativa: gif4j luz
Em primeiro lugar, o apoio de imagem em balanço é baseado em AWT, por isso "fazê-lo com Swing" não faz muito sentido.
Com exceção de que, você tem dois problemas: manter a transparência e manter a animação. A primeira questão é simples de resolver. Com BufferedImage.TYPE_INT_RGB
, você está criando um novo BufferedImage sem um canal alfa (informações de transparência). Se você alterar o tipo de BufferedImage.TYPE_INT_ARGB
, essa questão deve ser corrigido.
O bit de animação é um pouco mais difícil. Uma imagem ou um BufferedImage realmente não suporta animação, mas usando um GIF animado como uma fonte e exibindo a imagem em um componente GUI faz com que um tipo de interação não-divulgadas entre a imagem e o componente GUI, fazendo com que a animação que será exibida. A maneira como você copiar a imagem original para um BufferedImage provavelmente causa a estrutura única, que é atualmente exibida a ser copiado para o BufferedImage. É mais do que duas linhas de código, mas você pode usar o ImageReader em javax.imageio para ler cada único frame do GIF animado e ImageWriter para criar um novo GIF animado a partir das imagens espelhadas.