1.java 直接使用JLabel显示GIF图片速度总会特别快不能控制,需要自己写控件去实现JLaebl的功能

package Main;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JLabel;

import com.sun.imageio.plugins.gif.GIFImageMetadata;

public class GifComponent extends JLabel {  
        private static final long serialVersionUID = 1L;  
        private GifBean[] gifBeans;  
        private Map<Integer, Integer[]> gifBeanMap = new HashMap<Integer, Integer[]>();  
        private int index = 0;  
        private int delayFactor;  
        private Timer timer;  
      
        /**
         *  
         * @param gifFile
         * @param delayFactor
         *            显示gif每帧图片的时间因子
         */  
        public GifComponent(File gifFile, int delayFactor,int width,int height) {  
        setDelayFactor(delayFactor);  
        setGifFile(gifFile,width,height);  
        }  
      
        /**
         * 设置Gif文件
         *  
         * @param gifFile
         */  
        public void setGifFile(File gifFile,int width,int height) {  
        ImageReader reader = null;  
        try {  
            ImageInputStream imageIn = ImageIO.createImageInputStream(gifFile);  
            Iterator<ImageReader> iter = ImageIO  
                .getImageReadersByFormatName("gif");  
            if (iter.hasNext()) {  
            reader = iter.next();  
            }  
            reader.setInput(imageIn, false);  
            gifBeanMap.clear();  
            gifBeans = new GifBean[reader.getNumImages(true)];  
            GIFImageMetadata meta = null;  
            for (int i = 0; i < gifBeans.length; i++) {  
            meta = (GIFImageMetadata) reader.getImageMetadata(i);  
            gifBeans[i] = new GifBean();  
            
            BufferedImage originalImage =reader.read(i);
            BufferedImage newImage = new BufferedImage(width,height,originalImage.getType());
            Graphics g = newImage.getGraphics();
            g.drawImage(originalImage, 0,0,width,height,null);
            g.dispose();
            
            gifBeans[i].image = newImage;  
            gifBeans[i].x = meta.imageLeftPosition;  
            gifBeans[i].y = meta.imageTopPosition;  
            gifBeans[i].width = meta.imageWidth;  
            gifBeans[i].height = meta.imageHeight;  
            gifBeans[i].disposalMethod = meta.disposalMethod;  
            gifBeans[i].delayTime = meta.delayTime == 0 ? 1  
                : meta.delayTime;  
            }  
            for (int i = 1; i < gifBeans.length; i++) {  
            if (gifBeans[i].disposalMethod == 2) {  
                gifBeanMap.put(new Integer(i), new Integer[] { i });  
                continue;  
            }  
            int firstIndex = getFirstIndex(i);  
            List<Integer> list = new ArrayList<Integer>();  
            for (int j = firstIndex; j <= i; j++) {  
                list.add(j);  
            }  
            gifBeanMap.put(new Integer(i), list.toArray(new Integer[] {}));  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        setTimer();  
        }  
      
        private synchronized void setTimer() {  
        if (timer != null) {  
            timer.cancel();  
        }  
        timer = new Timer("show gif");  
        timer.schedule(new TimerTask() {  
            @Override  
            public void run() {  
            repaint();  
            try {  
                Thread.sleep(gifBeans[index].delayTime * delayFactor);  
            } catch (InterruptedException e) {  
            }  
            index++;  
            if (index >= gifBeans.length) {  
                index = 0;  
            }  
            }  
      
        }, 0, 1);  
      
        }  
      
        /**
         * 设置时间因子
         *  
         * @param delayFactor
         */  
        public void setDelayFactor(int delayFactor) {  
        this.delayFactor = delayFactor;  
        }  
      
        @Override  
        protected void paintComponent(Graphics g) {  
        g.drawImage(gifBeans[0].image, gifBeans[0].x, gifBeans[0].y, this);  
        if (index > 0) {  
            Integer[] array = gifBeanMap.get(index);  
            for (Integer i : array) {  
            g.drawImage(gifBeans[i].image, gifBeans[i].x, gifBeans[i].y,  
                this);  
            }  
        }  
        }  
      
        private int getFirstIndex(int index) {  
        int tempIndex = index;  
        while (tempIndex > 1) {  
            if (tempIndex - 1 > 0  
                && gifBeans[tempIndex - 1].disposalMethod == 2) {  
            return index;  
            }  
            tempIndex--;  
        }  
        return tempIndex;  
        }  
      
        /**
         * 用于保持gif每帧图片的信息
         */  
        public class GifBean {  
        public BufferedImage image;  
        public int x;  
        public int y;  
        public int width;  
        public int height;  
        public int disposalMethod;  
        public int delayTime;  
        }  
      
    }

在Jframe 中加入该组件的方法:

public GIFShow(String pathOfGif) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(500, 200, 421, 322);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        // 使用系统自带的Label显示GIF
//        label = new JLabel("");
//        label.setBounds(0, 0, 413, 288);
//        contentPane.add(label);        
//        ImageIcon ic1=new ImageIcon(pathOfGif);
//        ic1.setImage(ic1.getImage().getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_DEFAULT));
//        label.setIcon(ic1);
        
        
        
        //使用自己的组件显示GIF
        GifComponent gifComponent=new GifComponent(new File(pathOfGif), 120,413,288);
        gifComponent.setBounds(0, 0, 413, 288);
        contentPane.add(gifComponent);
    }

其中改变Bufferdimage 的尺寸大小的方法:

BufferedImage originalImage = 你的原图片int width = 宽度;
int height = 高度;
BufferedImage newImage = new BufferedImage(width,height,originalImage.getType());
Graphics g = newImage.getGraphics();
g.drawImage(originalImage, 0,0,width,height,null);
g.dispose();

newImage  中存储的便是改变尺寸之后的Bufferdimage

关于 java 显示GIF相关推荐

  1. Java显示the type xxx is already defined的解决方法

    Java显示the type xxx is already defined 今天在做Java的时候,Eclipse一直显示错误,打开一看,显示The type xxx is already defin ...

  2. java实现gif动画效果(java显示动态图片)

    关闭 关闭 脚本之家 软件下载 源码下载 在线工具 网页教程基础 服务器常用软件 手机版 关注微信 网页制作 网络编程 脚本专栏 脚本下载 数据库 CMS教程 电子书籍 平面设计 媒体动画 操作系统 ...

  3. java 显示中文_java显示中文乱码的解决方法

    java显示中文乱码的解决方法 发布时间:2020-06-16 11:08:43 来源:亿速云 阅读:97 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java显示中文乱码的解决方法,代码非常 ...

  4. java 显示 装配_SpringInAction--自动化装配(显示装配之 java注解配置)

    Spring在配置时候有三种方案可选 1.在xml中进行显示配置 2.在java中进行显示配置 3.隐式的Bean发现机制和自动装配 今天学习的 第二种-- 在java中进行显示配置 场景: 尽管在很 ...

  5. java动态图片_java实现gif动画效果(java显示动态图片)

    关闭 关闭 java实现gif动画效果(java显示动态图片) 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-29我要评论 这篇文章主要介绍了java实现gif动画效果示例(java ...

  6. java显示图片_java显示图片的方法

    java显示图片的方法 applet能显示GIF,JPEG,BMP等其他格式的图片.为了在applet中显示图片,你需要使用java.awt.Graphics类的drawImage()方法.以下是小编 ...

  7. java显示被阻止_win7系统打开java显示应用程序已安全设置被阻止的解决方法

    今天和大家分享一下win7系统打开java显示应用程序已安全设置被阻止问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统打开java显示应用程序已安全设置被阻止的问题,有什么好 ...

  8. java怎么设置安全设置,win10系统打开java显示应用程序已安全设置被阻止的具体技巧...

    有关win10系统打开java显示应用程序已安全设置被阻止的操作方法想必大家有所耳闻.但是能够对win10系统打开java显示应用程序已安全设置被阻止进行实际操作的人却不多.其实解决win10系统打开 ...

  9. java显示链表在jtable上输出_jtable的使用精华

    jtable的使用精华 众所皆知,java中没有像c#中的DATAGRID似的数据显示控件,所以不能直接显示数据,只有通过自己定制表格才能显示数据,请个位来讨论一下java中用来显示数据jtable的 ...

  10. java显示位图_java – 大图标位图在通知中显示为白色方块?

    我有这个问题,我从我在通知中使用的URL生成位图.然而,在我的手机上,Bitmap显示为一个小白色的方块.我看着它,发现很多帖子像这样说: Icon not displaying in notific ...

最新文章

  1. python中argparse模块
  2. 《Go语言圣经》学习笔记 第十一章 测试
  3. [CF1036C]Classy Numbers
  4. kernel部分数据结构列表三(inode)
  5. 排序算法 —— 计数排序
  6. PCL1.8.0/ Qt5.7.0开发环境配置
  7. MyBatis学习总结(27)——Mybatis-Plus使用小技巧
  8. SQL语句常用优化技巧
  9. linux下用cronolog分割apache日志
  10. 一个可以直接套用的行星齿轮传动比(转速比)结论
  11. css 按钮按下样式
  12. 基于linux嵌入式浏览,基于LINUX的嵌入式浏览器的设计与 - 嵌入式操作系统 - 电子发烧友网...
  13. 红米手机开发者选项usb调试如何开启
  14. 2018艾耕科技笔试题
  15. Lambda表达式的一些相关知识理解
  16. 末位淘汰!985高校硕士毕业拟新规:强制20%不通过或需大改?
  17. linux下的SAMBA服务------SMB协议
  18. C++之适配器(以优先队列为例)
  19. 【pandas数据清洗与处理】项目5-城市餐饮店铺选址分析
  20. 采用Tagged Pointer的字符串

热门文章

  1. Azure Synapse Analytics (Azure SQL DW)性能优化指南(4)——使用结果集缓存优化性能
  2. C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集
  3. python打印斐波拉契数列
  4. 信号与系统--冲激响应
  5. javaScript教程笔记(一)JS简史
  6. 推荐系统入门(四):WideDeep(附代码)
  7. C++三目运算符(简述)
  8. 红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新7.2】
  9. 【OpenViNO】模型下载
  10. Linux 设置 FQDN