关于 java 显示GIF
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相关推荐
- Java显示the type xxx is already defined的解决方法
Java显示the type xxx is already defined 今天在做Java的时候,Eclipse一直显示错误,打开一看,显示The type xxx is already defin ...
- java实现gif动画效果(java显示动态图片)
关闭 关闭 脚本之家 软件下载 源码下载 在线工具 网页教程基础 服务器常用软件 手机版 关注微信 网页制作 网络编程 脚本专栏 脚本下载 数据库 CMS教程 电子书籍 平面设计 媒体动画 操作系统 ...
- java 显示中文_java显示中文乱码的解决方法
java显示中文乱码的解决方法 发布时间:2020-06-16 11:08:43 来源:亿速云 阅读:97 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java显示中文乱码的解决方法,代码非常 ...
- java 显示 装配_SpringInAction--自动化装配(显示装配之 java注解配置)
Spring在配置时候有三种方案可选 1.在xml中进行显示配置 2.在java中进行显示配置 3.隐式的Bean发现机制和自动装配 今天学习的 第二种-- 在java中进行显示配置 场景: 尽管在很 ...
- java动态图片_java实现gif动画效果(java显示动态图片)
关闭 关闭 java实现gif动画效果(java显示动态图片) 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-29我要评论 这篇文章主要介绍了java实现gif动画效果示例(java ...
- java显示图片_java显示图片的方法
java显示图片的方法 applet能显示GIF,JPEG,BMP等其他格式的图片.为了在applet中显示图片,你需要使用java.awt.Graphics类的drawImage()方法.以下是小编 ...
- java显示被阻止_win7系统打开java显示应用程序已安全设置被阻止的解决方法
今天和大家分享一下win7系统打开java显示应用程序已安全设置被阻止问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统打开java显示应用程序已安全设置被阻止的问题,有什么好 ...
- java怎么设置安全设置,win10系统打开java显示应用程序已安全设置被阻止的具体技巧...
有关win10系统打开java显示应用程序已安全设置被阻止的操作方法想必大家有所耳闻.但是能够对win10系统打开java显示应用程序已安全设置被阻止进行实际操作的人却不多.其实解决win10系统打开 ...
- java显示链表在jtable上输出_jtable的使用精华
jtable的使用精华 众所皆知,java中没有像c#中的DATAGRID似的数据显示控件,所以不能直接显示数据,只有通过自己定制表格才能显示数据,请个位来讨论一下java中用来显示数据jtable的 ...
- java显示位图_java – 大图标位图在通知中显示为白色方块?
我有这个问题,我从我在通知中使用的URL生成位图.然而,在我的手机上,Bitmap显示为一个小白色的方块.我看着它,发现很多帖子像这样说: Icon not displaying in notific ...
最新文章
- python中argparse模块
- 《Go语言圣经》学习笔记 第十一章 测试
- [CF1036C]Classy Numbers
- kernel部分数据结构列表三(inode)
- 排序算法 —— 计数排序
- PCL1.8.0/ Qt5.7.0开发环境配置
- MyBatis学习总结(27)——Mybatis-Plus使用小技巧
- SQL语句常用优化技巧
- linux下用cronolog分割apache日志
- 一个可以直接套用的行星齿轮传动比(转速比)结论
- css 按钮按下样式
- 基于linux嵌入式浏览,基于LINUX的嵌入式浏览器的设计与 - 嵌入式操作系统 - 电子发烧友网...
- 红米手机开发者选项usb调试如何开启
- 2018艾耕科技笔试题
- Lambda表达式的一些相关知识理解
- 末位淘汰!985高校硕士毕业拟新规:强制20%不通过或需大改?
- linux下的SAMBA服务------SMB协议
- C++之适配器(以优先队列为例)
- 【pandas数据清洗与处理】项目5-城市餐饮店铺选址分析
- 采用Tagged Pointer的字符串