Java 创建一个镜像为另一个的ImageIcon

Java 创建一个镜像为另一个的ImageIcon,java,swing,animation,awt,flip,Java,Swing,Animation,Awt,Flip,我想知道是否有一种方法可以创建一个镜像另一个ImageIcon的ImageIcon 在谷歌上搜索,我发现了如何使用许多AWT库来实现这一点 有没有办法用Swing来做?如果没有,我在AWT方法方面仍然有问题: 我要镜像的图像图标是动画gif(包含透明颜色),AWT方法返回非透明(透明颜色更改为不透明黑色)和非动画gif 你知道如何保持动画和透明的颜色吗 以下是我找到的AWT代码(rangerStand是原始图像图标): 感谢阅读。不知道如何解决本机Swing或AWT的问题-尽管Java支持GIF

我想知道是否有一种方法可以创建一个镜像另一个ImageIcon的ImageIcon

在谷歌上搜索,我发现了如何使用许多AWT库来实现这一点

有没有办法用Swing来做?如果没有,我在AWT方法方面仍然有问题:

我要镜像的图像图标是动画gif(包含透明颜色),AWT方法返回非透明(透明颜色更改为不透明黑色)和非动画gif

你知道如何保持动画和透明的颜色吗

以下是我找到的AWT代码(rangerStand是原始图像图标):


感谢阅读。

不知道如何解决本机Swing或AWT的问题-尽管Java支持GIF89a的透明性和动画。我想,你必须打开GIF89a,一个接一个地镜像动画图像,然后重新打包。至少有一个库可以尝试一下:

不知道如何解决本机Swing或AWT的问题-尽管Java支持GIF89a的透明性和动画。我想,你必须打开GIF89a,一个接一个地镜像动画图像,然后重新打包。您至少可以尝试使用一个库:

您可能希望尝试对ImageIcon类进行子类化,并反向绘制图像。试试这段代码,它可能会奏效(我还没有尝试使用动画透明gif,但它应该可以工作):

编辑:我稍微修改了代码,并用动画gif对其进行了测试。它起作用了

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

}

您可能希望尝试对ImageIcon类进行子类化,并反向绘制图像。试试这段代码,它可能会奏效(我还没有尝试使用动画透明gif,但它应该可以工作):

编辑:我稍微修改了代码,并用动画gif对其进行了测试。它起作用了

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

}

首先,Swing中的映像支持是基于AWT的,所以“使用Swing实现”没有多大意义

除此之外,还有两个问题:保持透明度和保持动画。第一个问题很容易解决。使用
buffereImage.TYPE_INT_RGB
,您将创建一个没有alpha通道(透明度信息)的新buffereImage。如果将类型更改为
buffereImage.type\u INT\u ARGB
,则应修复该问题


动画部分的难度相当大。图像或BuffereImage并不真正支持动画,但使用动画GIF作为源并在GUI组件中显示图像会导致图像和GUI组件之间出现一种未公开的交互,从而显示动画。将原始图像复制到BuffereImage的方式可能会导致当前显示的单个帧复制到BuffereImage中。这需要两行以上的代码,但您可以使用javax.imageio中的ImageReader读取动画GIF的每一帧,并使用ImageWriter从镜像图像创建新的动画GIF。

首先,Swing中的图像支持基于AWT,因此“使用Swing执行”没有多大意义

除此之外,还有两个问题:保持透明度和保持动画。第一个问题很容易解决。使用
buffereImage.TYPE_INT_RGB
,您将创建一个没有alpha通道(透明度信息)的新buffereImage。如果将类型更改为
buffereImage.type\u INT\u ARGB
,则应修复该问题


动画部分的难度相当大。图像或BuffereImage并不真正支持动画,但使用动画GIF作为源并在GUI组件中显示图像会导致图像和GUI组件之间出现一种未公开的交互,从而显示动画。将原始图像复制到BuffereImage的方式可能会导致当前显示的单个帧复制到BuffereImage中。这需要两行以上的代码,但您可以使用javax.imageio中的ImageReader读取动画GIF的每一帧,并使用ImageWriter从镜像图像创建新的动画GIF。

'ImageIcon lolimg=new MirrorImageIcon(“images/Sprites/Ranger/stand.GIF”);JLabel-lolabel=新的JLabel(lolimg);落叶松(16,0,16,16);面板。添加(lolabel);'panel=getContentPane()是我的JApplet的。JLabel是空的。我做错了什么?嗯。。。我真的不知道。。。尝试不手动设置边界并使用布局管理器。也许这样行。你试过我的代码了吗?使用图像“Images/Sprites/Ranger/stand.gif”进行尝试,如果效果不好,则会出现其他问题…当您说“panel=getContentPane()”时,是否将面板的内容窗格指定给参考“panel”?因为你应该反过来做。试试setContentPane(面板),我刚刚添加了MirrorImageIcon类。我可以使用普通ImageIcon方法使用图像。该图像也没有显示在布局管理器中。不,抱歉,我的错误:面板是添加到getContentPane()的JLayeredPane(),我将我的所有组件都添加到其中。'ImageIcon lolimg=new MirrorImageIcon(“Images/Sprites/Ranger/stand.gif”);JLabel-lolabel=新的JLabel(lolimg);落叶松(16,0,16,16);面板。添加(lolabel);'panel=getContentPane()是我的JApplet的。JLabel是空的。我做错了什么?嗯。。。我真的不知道。。。尝试不手动设置边界并使用布局管理器。也许这样行。你试过我的代码了吗?使用图像“Images/Sprites/Ranger/stand.gif”进行尝试,如果效果不好,则会出现其他问题…当您说“panel=getContentPane()”时,是否将面板的内容窗格指定给参考“panel”?因为你应该反过来做。试试setContentPane(面板),我刚刚添加了MirrorImageIcon类。我可以将图像与正常图像图标配合使用