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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top