Question

Je voudrais savoir s'il y a un moyen de créer un ImageIcon qui est le miroir d'un autre ImageIcon.

Recherche sur Google, j'ai trouvé comment le faire en utilisant de nombreuses bibliothèques AWT.

Est-il possible de le faire avec swing? Sinon, je suis encore avoir des problèmes avec la méthode AWT:

Le ImageIcon Je veux miroir est un gif animé (par contient une couleur transparente) et la méthode de AWT renvoie un non-transparent (la couleur transparente est modifiée en noir opaque) et GIF non animés.

Toutes les idées comment garder l'animation et la couleur transparente?

Voici le code AWT j'ai trouvé (rangerStand étant le ImageIcon d'origine):

 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);

Merci pour la lecture.

Était-ce utile?

La solution

Vous pouvez essayer de la classe sous-classement ImageIcon et peindre l'image inversée. Essayez ce morceau de code, il pourrait faire l'affaire (je ne l'ai pas essayé avec gif transparent animé, mais il devrait fonctionner):

EDIT: Je légèrement changé le code et testé avec un GIF animé. Il fonctionne!

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);
    }

}

Autres conseils

Aucune idée sur la façon de résoudre le problème avec swing ou AWT natif - bien que Java prend en charge GIF89a avec la transparence et l'animation. Je suppose que, vous devez décompresser le GIF89a, miroir les images d'animation un par un et remballer. Il y a au moins une bibliothèque que vous pourriez donner un essai: gif4j lumière

Tout d'abord, le support d'image Swing est basée sur AWT, si « le faire avec Swing » ne fait pas beaucoup de sens.

Sauf pour cela, vous avez deux problèmes: Garder la transparence et de garder l'animation. La première question est simple à résoudre. Avec BufferedImage.TYPE_INT_RGB, vous créez une nouvelle BufferedImage sans canal alpha (transparence de l'information). Si vous changez le type de BufferedImage.TYPE_INT_ARGB, ce problème devrait être résolu.

Le bit d'animation est un peu plus difficile. Une image ou un BufferedImage ne prend pas en charge vraiment l'animation, mais en utilisant un GIF animé comme source et afficher l'image dans un composant graphique provoque une sorte d'interaction non divulguée entre l'image et le composant graphique, ce qui provoque l'animation à afficher. La façon dont vous copiez l'image originale à un BufferedImage probablement faire le cadre unique, qui est actuellement affichée à copier dans le BufferedImage. Il est plus de deux lignes de code, mais vous pouvez utiliser le ImageReader en javax.imageio pour lire chaque image unique du GIF animé et ImageWriter pour créer un nouveau GIF animé à partir des images en miroir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top