2009-11-10 61 views
1

我想知道是否有辦法創建一個ImageIcon,它是另一個ImageIcon的鏡像。創建另一個鏡像的ImageIcon

在谷歌搜索,我發現如何使用許多AWT庫。

有沒有辦法與Swing做到這一點?如果沒有,我仍然遇到麻煩的AWT方法:

我想鏡像的ImageIcon是一個動畫gif(包含透明顏色),並且AWT方法返回一個不透明的(透明顏色被更改以不透明的黑色)和非動畫gif。

任何想法如何保持動畫和透明色?

這裏是AWT代碼,我發現(rangerStand是原始的ImageIcon):

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

感謝您的閱讀。

回答

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

} 
+1

+1原始的方式來解決這個問題 – 2009-11-10 16:04:37

+0

'ImageIcon lolimg = new MirrorImageIcon(「Images/Sprites/Ranger/stand.gif」); \t \t JLabel lolabel = new JLabel(lolimg); \t \t lolabel.setBounds(16,0,16,16); \t \t panel.add(lolabel);' panel = getContentPane()我的JApplet。 JLabel是空的。我究竟做錯了什麼 ? – 2009-11-10 16:26:34

+0

hm ...我真的不知道...嘗試沒有手動設置邊界和使用佈局管理器。也許這將工作。你有沒有嘗試我的代碼?嘗試使用圖像「Images/Sprites/Ranger/stand.gif」,如果這不起作用,那麼其他地方也是錯誤的... – 2009-11-10 16:30:18

0

不知道如何解決本地Swing或AWT的問題 - 雖然Java支持透明度和動畫的GIF89a。我想,你必須解壓縮GIF89a,逐個鏡像動畫圖像並重新打包。有至少一個庫,你可以試一試:gif4j light

0

首先,Swing中的圖像支持是基於AWT,所以「與Swing做」並沒有多大意義。

除此之外,你有兩個問題:保持透明度和保持動畫。第一個問題很容易解決。使用BufferedImage.TYPE_INT_RGB,您將創建一個不帶Alpha通道的新BufferedImage(透明度信息)。如果您將類型更改爲BufferedImage.TYPE_INT_ARGB,則應該修復該問題。

動畫位比較難。一個Image或一個BufferedImage並不真的支持動畫,但是使用動畫GIF作爲源並在GUI組件中顯示圖像會導致圖像和GUI組件之間的一種未公開的交互,導致動畫被顯示。將原始圖像複製到BufferedImage的方式可能會導致當前顯示的單個幀被複制到BufferedImage中。它不止兩行代碼,但您可以使用javax.imageio中的ImageReader讀取動畫GIF和ImageWriter的每個單幀,以便從鏡像圖像創建一個新的動畫GIF。