Frage

Ich werde gerne wissen, ob es einen Weg gibt eine ImageIcon zu schaffen, die den Spiegel eines anderen ImageIcon ist.

Suchen auf Google, fand ich, wie es geht durch viele AWT-Bibliotheken verwendet wird.

Gibt es eine Möglichkeit, es mit Schwingen zu tun? Wenn nicht, ich habe immer noch Probleme mit der AWT-Methode:

Die ImageIcon I zu spiegel ist ein animiertes GIF (mit einer transparenten Farbe enthält) und die AWT Methode liefert ein nicht-transparent (die transparente Farbe ist undurchsichtig schwarz geändert) und nicht-animieren gif.

Irgendwelche Ideen, wie die Animation zu halten und die transparente Farbe?

Dies ist der AWT Code, den ich gefunden (rangerStand die ursprüngliche ImageIcon sein):

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

Danke für das Lesen.

War es hilfreich?

Lösung

Vielleicht möchten Sie versuchen und Subklassen die ImageIcon Klasse und malen das Bild umgekehrt. Versuchen Sie dieses Stück Code, es könnte den Trick tun (ich habe nicht versucht, mit animierten transparent gif aber es sollte funktionieren):

EDIT: ich leicht verändert den Code und getestet es mit einem animierten GIF. Es funktioniert!

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

}

Andere Tipps

Keine Ahnung, wie das Problem mit nativer Schwingen oder AWT zu lösen - obwohl Java GIF89a mit Transparenz und Animationen unterstützt. Ich denke, müssen Sie die GIF89a entpacken spiegeln die Animationsbilder one-by-one und umpacken. Es gibt mindestens eine Bibliothek, die Sie ausprobieren können: Gif4J Licht

Zu allererst wird der Bildträger in Swing auf AWT basiert, so dass „es mit Schaukel tun“ macht nicht viel Sinn machen.

Mit Ausnahme, dass, haben Sie zwei Probleme: die Transparenz zu halten und um die Animation zu halten. Das erste Problem ist einfach zu lösen. Mit BufferedImage.TYPE_INT_RGB, erstellen Sie einen neuen BufferedImage ohne Alphakanal (Transparenzinformationen). Wenn Sie den Typ BufferedImage.TYPE_INT_ARGB ändern, sollte das Problem behoben werden.

Die Animation Bit ist ein bisschen schwieriger. Ein Bild oder ein BufferedImage nicht wirklich Animation unterstützen, aber ein animiertes GIF als Quelle verwenden und das Bildes in einer GUI-Komponente Anzeige bewirkt eine Art von nicht-offenbarten Wechselwirkung zwischen dem Bild und der GUI-Komponente, wodurch die Animation dargestellt werden. Die Art und Weisen Sie das Originalbild zu einem BufferedImage kopieren wird wahrscheinlich den einzigen Frame verursachen, die zur Zeit in die BufferedImage kopiert wird angezeigt. Es ist mehr als zwei Zeilen Code, aber Sie den Imagereader in javax.imageio verwenden können jeden einzelnen Frame des animierten GIF und ImageWriter- lesen einen neuen animierten GIF aus den gespiegelten Bilder zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top