标签背景正方形显示的Java 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(); } } 

非常感谢,对不起我的英语不好!

使用Riven的解决方案,url为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 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 getFrames(URL gif) throws IOException{ ArrayList frames = new ArrayList(); 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://sofzh.miximages.com/java/872436-4CD65DA.gif"); } catch (MalformedURLException ex) { Logger.getLogger(TestGif.class.getName()).log(Level.SEVERE, null, ex); } List gifFrames = new ArrayList(); ArrayList 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://sofzh.miximages.com/java/874900-EFU9R4J.gif

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

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

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

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

 URL url = new URL("http://sofzh.miximages.com/java/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://sofzh.miximages.com/java/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(); } }); } }