문제

다른 imageicon의 거울 인 imageicon을 만들 수있는 방법이 있는지 알고 싶습니다.

Google을 검색하면 많은 AWT 라이브러리를 사용하여 수행하는 방법을 찾았습니다.

스윙으로 할 수있는 방법이 있습니까? 그렇지 않다면 여전히 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);

읽어 주셔서 감사합니다.

도움이 되었습니까?

해결책

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

}

다른 팁

Java는 투명성 및 애니메이션으로 GIF89A를 지원하지만 Native Swing 또는 AWT의 문제를 해결하는 방법에 대해 전혀 모릅니다. 나는 당신이 GIF89A를 풀고, 애니메이션 이미지를 일대일로 반영하고 다시 포장해야한다고 생각합니다. 시도해 볼 수있는 도서관이 하나 이상 있습니다. gif4j 빛

우선, 스윙의 이미지 지원은 AWT를 기반으로하므로 "스윙으로 수행하는"것은 그다지 의미가 없습니다.

이를 제외하고는 투명성을 유지하고 애니메이션을 유지하는 두 가지 문제가 있습니다. 첫 번째 문제는 해결하기가 간단합니다. 와 함께 BufferedImage.TYPE_INT_RGB, 당신은 알파 채널 (투명성 정보)없이 새로운 bufferedimage를 생성하고 있습니다. 유형을 변경하면 BufferedImage.TYPE_INT_ARGB, 그 문제는 수정되어야합니다.

애니메이션 비트가 조금 더 어렵습니다. 이미지 또는 BufferedImage는 실제로 애니메이션을 지원하지 않지만 애니메이션 GIF를 소스로 사용하고 GUI 구성 요소에 이미지를 표시하면 이미지와 GUI 구성 요소 사이의 비공개 상호 작용이 발생하여 애니메이션이 표시됩니다. 원본 이미지를 버퍼 페디이지에 복사하는 방식은 아마도 단일 프레임을 유발할 수 있으며, 현재는 버퍼 페드 이티지에 복사되도록 표시됩니다. 두 줄 이상의 코드이지만 javax.imageio의 ImageReader를 사용하여 애니메이션 GIF 및 ImageWriter의 각 단일 프레임을 읽어 미러 이미지에서 새로운 애니메이션 GIF를 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top