标签背景正方形显示的Java Gif?

时间:2012-03-14 09:33:32

标签: java swing gif

我正在尝试在我的应用程序上使用.gif文件,并且它不太好......当我添加.gif时,它会显示我的.gif移动的标签..但旁边有正方形:s 有点akward ......

这是我的.gif: http://sadpanda.us/images/872436-4CD65DA.gif

这是我的代码:

public class TestGif {

    private JFrame frame;


    public TestGif(){
        this.frame = new JFrame("teste");
        frame.setSize(200,200);
        ImageIcon icon = new ImageIcon("dark.gif");
        JLabel label = new JLabel(icon);
        icon.setImageObserver(label);
        frame.getContentPane().add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    public static void main(String[] args) throws Exception {
        new TestGif();
    }
}

非常感谢,抱歉我的英语不好!

2 个答案:

答案 0 :(得分:3)

使用Riven的解决方案http://riven8192.blogspot.com/2010/02/image-java-animated-gifs.html

<强> ImageUtil.java:

public class ImageUtil
{
    public static BufferedImage convertRGBAToGIF(BufferedImage src, int transColor)
    {
        BufferedImage dst = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
        Graphics g = dst.getGraphics();
        g.setColor(new Color(transColor));
        g.fillRect(0, 0, dst.getWidth(), dst.getHeight());
        {
            IndexColorModel indexedModel = (IndexColorModel) dst.getColorModel();
            WritableRaster raster = dst.getRaster();
            int sample = raster.getSample(0, 0, 0);
            int size = indexedModel.getMapSize();
            byte[] rr = new byte[size];
            byte[] gg = new byte[size];
            byte[] bb = new byte[size];
            indexedModel.getReds(rr);
            indexedModel.getGreens(gg);
            indexedModel.getBlues(bb);
            IndexColorModel newModel = new IndexColorModel(8, size, rr, gg, bb, sample);
            dst = new BufferedImage(newModel, raster, dst.isAlphaPremultiplied(), null);
        }
        dst.createGraphics().drawImage(src, 0, 0, null);
        return dst;
    }

    public static void saveAnimatedGIF(OutputStream out, List<GifFrame> frames, int loopCount) throws Exception
    {
        ImageWriter iw = ImageIO.getImageWritersByFormatName("gif").next();

        ImageOutputStream ios = ImageIO.createImageOutputStream(out);
        iw.setOutput(ios);
        iw.prepareWriteSequence(null);

        int p = 0;
        for (GifFrame frame : frames)
        {
            ImageWriteParam iwp = iw.getDefaultWriteParam();
            IIOMetadata metadata = iw.getDefaultImageMetadata(new ImageTypeSpecifier(frame.img), iwp);
            ImageUtil.configureGIFFrame(metadata, String.valueOf(frame.delay / 10L), p++, frame.disposalMethod, loopCount);
            IIOImage ii = new IIOImage(frame.img, null, metadata);
            iw.writeToSequence(ii, null);
        }

        iw.endWriteSequence();
        ios.close();
    }

    private static void configureGIFFrame(IIOMetadata meta, String delayTime, int imageIndex, String disposalMethod, int loopCount)
    {
        String metaFormat = meta.getNativeMetadataFormatName();

        if (!"javax_imageio_gif_image_1.0".equals(metaFormat))
        {
            throw new IllegalArgumentException("Unfamiliar gif metadata format: " + metaFormat);
        }

        Node root = meta.getAsTree(metaFormat);

        Node child = root.getFirstChild();
        while (child != null)
        {
            if ("GraphicControlExtension".equals(child.getNodeName()))
                break;
            child = child.getNextSibling();
        }

        IIOMetadataNode gce = (IIOMetadataNode) child;
        gce.setAttribute("userDelay", "FALSE");
        gce.setAttribute("delayTime", delayTime);
        gce.setAttribute("disposalMethod", disposalMethod);

        if (imageIndex == 0)
        {
            IIOMetadataNode aes = new IIOMetadataNode("ApplicationExtensions");
            IIOMetadataNode ae = new IIOMetadataNode("ApplicationExtension");
            ae.setAttribute("applicationID", "NETSCAPE");
            ae.setAttribute("authenticationCode", "2.0");
            byte[] uo = new byte[] { 0x1, (byte) (loopCount & 0xFF), (byte) ((loopCount >> 8) & 0xFF) };
            ae.setUserObject(uo);
            aes.appendChild(ae);
            root.appendChild(aes);
        }

        try
        {
            meta.setFromTree(metaFormat, root);
        }
        catch (IIOInvalidTreeException e)
        {
            throw new Error(e);
        }
    }
}

<强> TestGif.java:

public class TestGif {

    private JFrame frame;
    private URL url = null;

    public ArrayList<BufferedImage> getFrames(URL gif) throws IOException{
        ArrayList<BufferedImage> frames = new ArrayList<BufferedImage>();
        ImageReader ir = new GIFImageReader(new GIFImageReaderSpi());
        URLConnection urlconnection = gif.openConnection();
        ir.setInput(ImageIO.createImageInputStream(urlconnection.getInputStream()), false);
        for(int i = 0; i < ir.getNumImages(true); i++){
            ImageReadParam param = ir.getDefaultReadParam();
            frames.add(ir.read(i, param));
        }
        return frames;
    }

    public TestGif() throws FileNotFoundException {
        frame = new JFrame("teste");
        try {
            url = new URL("http://sadpanda.us/images/872436-4CD65DA.gif");
        } catch (MalformedURLException ex) {
            Logger.getLogger(TestGif.class.getName()).log(Level.SEVERE, null, ex);
        }

        List<GifFrame> gifFrames = new ArrayList<GifFrame>();
        ArrayList<BufferedImage> images = null;
        try {
            images = getFrames(url);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        for(BufferedImage image: images)
        {
            int transparantColor = image.getRGB(0, 0); // purple
            BufferedImage gif = ImageUtil.convertRGBAToGIF(image, transparantColor);
            long delay = 100; // every frame takes 100ms
            String disposal = GifFrame.RESTORE_TO_BGCOLOR; // make transparent pixels not 'shine through'
            gifFrames.add(new GifFrame(gif, delay, disposal));
        }

        OutputStream outputStream = new FileOutputStream("C:\\Documents and Settings\\DEVELOPER\\Desktop\\test.gif");

        int loopCount = 0; // loop indefinitely
        try {
            ImageUtil.saveAnimatedGIF(outputStream , gifFrames, loopCount);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        ImageIcon icon = null;
        try {
            icon = new ImageIcon(new File("C:\\Documents and Settings\\DEVELOPER\\Desktop\\test.gif").toURI().toURL());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JLabel label = new JLabel(icon);
        icon.setImageObserver(label);
        frame.getContentPane().add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                try {
                    new TestGif();
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

<强>结果:

http://sadpanda.us/images/874900-EFU9R4J.gif

解决方案不是那么优化,因为我必须创建一个临时的动画GIF文件,它删除主图像后面的恼人的彩色方块,然后在Swing GUI中将其加载为带标签的动画图标。

答案 1 :(得分:2)

你有问题确定哪里是dark.gif地方的位置

ImageIcon icon = new ImageIcon("dark.gif");

在这种情况下可以从URL获取Icon / ImageIcon

URL url = new URL("http://sadpanda.us/images/872436-4CD65DA.gif");

例如

import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestGif {

    private JFrame frame;
    private URL url = null;

    public TestGif() {
        frame = new JFrame("teste");
        try {
            url = new URL("http://sadpanda.us/images/872436-4CD65DA.gif");
        } catch (MalformedURLException ex) {
            Logger.getLogger(TestGif.class.getName()).log(Level.SEVERE, null, ex);
        }
        ImageIcon icon = new ImageIcon(url);
        JLabel label = new JLabel(icon);
        icon.setImageObserver(label);
        frame.getContentPane().add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new TestGif();
            }
        });
    }
}