1

別の ImageIcon のミラーである ImageIcon を作成する方法があるかどうか知りたいです。

Google で検索すると、多くの AWT ライブラリを使用してそれを行う方法が見つかりました。

Swing でそれを行う方法はありますか? そうでない場合、私はまだ AWT メソッドに問題があります:

ミラーリングしたい ImageIcon はアニメーション GIF (透明色を含む) であり、AWT メソッドは非透明 (透明色が不透明な黒に変更される) および非アニメーション GIF を返します。

アニメーションと透明色を維持する方法はありますか?

これが私が見つけたAWTコードです(元のImageIconはrangerStandです):

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

読んでくれてありがとう。

4

3 に答える 3

5

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

}
于 2009-11-10T15:42:49.157 に答える
0

ネイティブの Swing または AWT で問題を解決する方法がわかりません - Java は透過性とアニメーションで GIF89a をサポートしていますが。おそらく、GIF89a を解凍し、アニメーション画像を 1 つずつミラーリングして、再パックする必要があります。試してみることができるライブラリが少なくとも 1 つあります: gif4j light

于 2009-11-10T13:53:56.827 に答える
0

まず、Swing での画像サポートは AWT ベースなので、「Swing でやる」というのはあまり意味がありません。

それ以外には、透明度の維持とアニメーションの維持という 2 つの問題があります。最初の問題は簡単に解決できます。ではBufferedImage.TYPE_INT_RGB、アルファ チャネル (透明度情報) なしで新しい BufferedImage を作成しています。タイプを に変更するとBufferedImage.TYPE_INT_ARGB、その問題は修正されるはずです。

アニメーションビットはかなり難しいです。イメージまたは BufferedImage は実際にはアニメーションをサポートしていませんが、アニメーション GIF をソースとして使用し、イメージを GUI コンポーネントに表示すると、イメージと GUI コンポーネントの間で非公開の相互作用が発生し、アニメーションが表示されます。元の画像を BufferedImage にコピーする方法により、現在表示されている単一のフレームが BufferedImage にコピーされる可能性があります。これは 2 行を超えるコードですが、javax.imageio の ImageReader を使用してアニメーション GIF の各フレームを読み取り、ImageWriter を使用してミラーリングされたイメージから新しいアニメーション GIF を作成できます。

于 2009-11-10T15:51:24.817 に答える