2009-11-10 2 views
1

다른 ImageIcon의 미러 인 ImageIcon을 만드는 방법이 있는지 알고 싶습니다.다른 하나의 미러 인 ImageIcon 만들기

Google에서 검색하면 많은 AWT 라이브러리를 사용하여 검색하는 방법을 발견했습니다.

스윙과 함께 할 수있는 방법이 있습니까? 그렇지 않은 경우 AWT 메서드에 여전히 문제가 있습니다.

미러하려는 ImageIcon은 애니메이션 gif (투명한 색 포함)이며 AWT 메서드는 불투명도를 반환합니다 (투명한 색이 변경됨). 검은 불투명) 및 애니메이션이 아닌 gif.

애니메이션 및 투명한 색상을 유지하는 방법에 대한 아이디어가 있으십니까? 읽기

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

감사 : 여기

내가 (rangerStand 원래 이미지 아이콘 인) 발견 된 AWT 코드입니다.

답변

5

ImageIcon 클래스를 상속 받아 이미지를 역상으로 그릴 수 있습니다. 이 코드 조각을 시도해 보면 트릭을 할 수 있습니다. (애니메이션 투명 GIF로 시도하지는 않았지만 작동해야 함) :

EDIT : 코드를 약간 변경하고 애니메이션 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이 문제를 해결하는 원래 방법 –

+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); ' 내 JApplet의 panel = getContentPane(). JLabel은 비어 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까 ? –

+0

흠 ... 정말 모르겠다 ... 경계를 수동으로 설정하거나 레이아웃 관리자를 사용하지 않고 시도해보십시오.어쩌면 그렇게 될 것입니다. 내 코드를 그대로 사용 했습니까? "Images/Sprites/Ranger/stand.gif"이미지를 사용하여 시도해보십시오. 그래도 문제가 해결되지 않으면 다른 점이 있습니다 ... –

0

Java가 투명성과 애니메이션이있는 GIF89a를 지원하지만 원시 Swing 또는 AWT의 문제를 해결하는 방법은 없습니다. GIF89a를 풀고, 애니메이션 이미지를 하나씩 미러링 한 다음 다시 포장해야합니다. 시도 할 수있는 라이브러리가 적어도 하나 있습니다 : gif4j light

0

먼저, 스윙의 이미지 지원은 AWT를 기반으로, 그래서 "스윙과 함께 그 일을하는 것은"많은 이해가되지 않습니다.

다음을 제외하고 두 가지 문제가 있습니다. 투명성 유지 및 애니메이션 유지. 첫 번째 문제는 간단하게 해결할 수 있습니다. BufferedImage.TYPE_INT_RGB을 사용하면 알파 채널 (투명도 정보)없이 새 BufferedImage를 만듭니다. 형식을 BufferedImage.TYPE_INT_ARGB으로 변경하면 해당 문제가 해결됩니다.

애니메이션 비트가 상당히 어렵습니다. 이미지 또는 BufferedImage는 실제로 애니메이션을 지원하지 않지만 애니메이션 GIF를 소스로 사용하고 GUI 구성 요소에 이미지를 표시하면 이미지와 GUI 구성 요소간에 일종의 공개되지 않은 상호 작용이 발생하여 애니메이션이 표시됩니다. 원의 이미지를 BufferedImage에 카피하는 방법에 의해, 현재 표시되고있는 단일의 프레임이 BufferedImage에 카피되게 (듯이)합니다. 두 줄 이상의 코드가 있지만 javax.imageio의 ImageReader를 사용하여 애니메이션 GIF 및 ImageWriter의 각 단일 프레임을 읽어서 미러링 된 이미지에서 새로운 애니메이션 GIF를 만들 수 있습니다.

관련 문제