Domanda

mi piacerebbe sapere se c'è un modo per creare un ImageIcon che è lo specchio di un altro ImageIcon.

Ricerca su Google, ho trovato come farlo utilizzando molte librerie AWT.

C'è un modo per farlo con Swing? In caso contrario, sto ancora avendo problemi con il metodo AWT:

L'ImageIcon che voglio specchio è una gif animata (con contenere un colore trasparente) e il metodo restituisce un AWT non trasparente (il colore trasparente viene cambiato in nero opaco) e GIF non animata.

Tutte le idee come mantenere l'animazione e il colore trasparente?

Ecco il codice che ho trovato AWT (rangerStand essendo l'ImageIcon originale):

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

Grazie per la lettura.

È stato utile?

Soluzione

Si potrebbe desiderare di provare e sottoclassi della classe ImageIcon e dipingere l'immagine invertita. Provate questo pezzo di codice, potrebbe fare il trucco (non ho provato con gif animate trasparente ma dovrebbe funzionare):

EDIT: ho un po 'cambiato il codice e provato con una gif animata. Funziona!

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

}

Altri suggerimenti

Non ho idea su come risolvere il problema con swing nativo o AWT - anche se Java supporta GIF89a con la trasparenza e l'animazione. Credo, devi scompattare il GIF89a, rispecchiare le immagini di animazione one-by-one e imballare. C'è almeno una libreria che si potrebbe dare una prova: gif4j luce

Prima di tutto, il supporto delle immagini in Swing si basa su AWT, in modo da "fare con Swing" non ha molto senso.

A parte questo, ci sono due problemi: Mantenere la trasparenza e mantenendo l'animazione. La prima questione è semplice da risolvere. Con BufferedImage.TYPE_INT_RGB, si sta creando un nuovo BufferedImage senza un canale alfa (informazioni sulla trasparenza). Se si cambia il tipo di BufferedImage.TYPE_INT_ARGB, che problema dovrebbe essere risolto.

Il bit animazione è un po 'più difficile. Un'immagine o un BufferedImage realtà non supporta animazione, ma utilizzando una GIF animata come una sorgente e visualizzare l'immagine in un componente GUI provoca un tipo di interazione non descritto tra l'immagine e il componente GUI, causando l'animazione da visualizzare. Il modo in cui si copia l'immagine originale ad un BufferedImage probabilmente sì che il singolo fotogramma, che è attualmente visualizzato da copiare nella BufferedImage. E 'più di due righe di codice, ma è possibile utilizzare l'ImageReader in javax.imageio a leggere ogni singolo fotogramma del GIF animato e ImageWriter per creare una nuova GIF animato dalle immagini riflesse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top