仅将延迟替换为零的帧。

public static Image readImgFromFile(String filename, Component parent) {

File file = new File(filename);

if (!file.exists()) {

return null;

}

// Fix for bug when delay is 0

try {

// Load anything but GIF the normal way

if (!filename.substring(filename.length() - 4).equalsIgnoreCase(".gif")) {

return ImageIO.read(file);

}

// Get GIF reader

ImageReader reader = ImageIO.getImageReadersByFormatName("gif").next();

// Give it the stream to decode from

reader.setInput(ImageIO.createImageInputStream(file));

int numImages = reader.getNumImages(true);

// Get 'metaFormatName'. Need first frame for that.

IIOMetadata imageMetaData = reader.getImageMetadata(0);

String metaFormatName = imageMetaData.getNativeMetadataFormatName();

// Find out if GIF is bugged

boolean foundBug = false;

for (int i = 0; i < numImages && !foundBug; i++) {

// Get metadata

IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(i).getAsTree(metaFormatName);

// Find GraphicControlExtension node

int nNodes = root.getLength();

for (int j = 0; j < nNodes; j++) {

Node node = root.item(j);

if (node.getNodeName().equalsIgnoreCase("GraphicControlExtension")) {

// Get delay value

String delay = ((IIOMetadataNode)node).getAttribute("delayTime");

// Check if delay is bugged

if (Integer.parseInt(delay) == 0) {

foundBug = true;

}

break;

}

}

}

// Load non-bugged GIF the normal way

Image image;

if (!foundBug) {

image = Toolkit.getDefaultToolkit().createImage(filename);

} else {

// Prepare streams for image encoding

ByteArrayOutputStream baoStream = new ByteArrayOutputStream();

try (ImageOutputStream ios = ImageIO.createImageOutputStream(baoStream)) {

// Get GIF writer that's compatible with reader

ImageWriter writer = ImageIO.getImageWriter(reader);

// Give it the stream to encode to

writer.setOutput(ios);

writer.prepareWriteSequence(null);

for (int i = 0; i < numImages; i++) {

// Get input image

BufferedImage frameIn = reader.read(i);

// Get input metadata

IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(i).getAsTree(metaFormatName);

// Find GraphicControlExtension node

int nNodes = root.getLength();

for (int j = 0; j < nNodes; j++) {

Node node = root.item(j);

if (node.getNodeName().equalsIgnoreCase("GraphicControlExtension")) {

// Get delay value

String delay = ((IIOMetadataNode)node).getAttribute("delayTime");

// Check if delay is bugged

if (Integer.parseInt(delay) == 0) {

// Overwrite with a valid delay value

((IIOMetadataNode)node).setAttribute("delayTime", "10");

}

break;

}

}

// Create output metadata

IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(frameIn), null);

// Copy metadata to output metadata

metadata.setFromTree(metadata.getNativeMetadataFormatName(), root);

// Create output image

IIOImage frameOut = new IIOImage(frameIn, null, metadata);

// Encode output image

writer.writeToSequence(frameOut, writer.getDefaultWriteParam());

}

writer.endWriteSequence();

}

// Create image using encoded data

image = Toolkit.getDefaultToolkit().createImage(baoStream.toByteArray());

}

// Trigger lazy loading of image

MediaTracker mt = new MediaTracker(parent);

mt.addImage(image, 0);

try {

mt.waitForAll();

}

catch (InterruptedException e) {

image = null;

}

return image;

}

catch (IOException e) {

e.printStackTrace();

return null;

}

}

java gif 帧_修复Java中动画gif的帧频相关推荐

  1. java gif 帧_在Java中修复动画gif的帧速率

    我找到了this,它适用于我试过的一个gif. 我不知道他到底在做什么,但是看起来如果第一帧的延迟为0它会覆盖所有帧的延迟为10.然后他在内存中"写入"一个新的GIF文件并将其加载 ...

  2. 计算机中丢失msc,mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll

    mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll mscvr120.dll是系统的非常重要的一个文件,相信很多的人都是遇到文件丢失的情况,这个时候就需要你在下载一个d ...

  3. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  4. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  5. java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创

    由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...

  6. java jar 目录_将Java类路径中的所有jar包括在一个目录中

    有没有一种方法可以将所有的jar文件包含在类路径的目录中? 我正在尝试java -classpath lib / *.jar :. my.package.Program,它无法找到当然在这些罐子里的类 ...

  7. java gradle构建_在Gradle中为JPMS构建Java 6-8库

    java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...

  8. java避免空指针异常_避免Java中的空指针异常

    java避免空指针异常 空指针异常是Java中最常见,最烦人的异常. 在这篇文章中,我想避免这种不希望的异常. 首先让我们创建引发空指针异常的示例 private Boolean isFinished ...

  9. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home

    我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...

最新文章

  1. 今天遇到一个很奇怪的问题,XP系统屏幕全部旋转90度
  2. 【FI模块学习笔记】 固定资产概述(上)
  3. logback基础配置文件
  4. 小米登录协议分析_小米温湿度传感器协议分析
  5. 【Java】递归删除文件目录
  6. 7 学大厂,拓展基础组件封装思路 BAT?TMD
  7. 2015/6/9 站立会议以及索引卡更新
  8. ofo给还在路上垂死挣扎的战友们留下什么启示?
  9. Datawhale 202210 Excel | 第五、六、七章 Excel函数示例 Excel函数列表
  10. python移动文件夹下所有文件到另一个文件夹
  11. 硬件设计——一键开关机
  12. Julia 安装,使用教程
  13. 谷歌广告投放,谷歌广告怎么投放?
  14. TERMIN汤铭,FE8.1芯片一进四出扩展坞(HUB)集线器芯片。
  15. 密码加盐原理及其实现
  16. 第三届进博会倒计时100天,欧莱雅、雅诗兰黛、爱茉莉太平洋积极筹备参展 | 美通企业日报...
  17. 非视线成像:角膜成像系统
  18. 机器视觉丨环形无影光源丨原理及打光案例
  19. Doxygen使用指南,Doxygen介绍一
  20. Elasticsearch:Rank feature query - 排名功能查询

热门文章

  1. 二道题:分组顺序向下填充 和 标注数据整理
  2. 如何使用阿里云的短息服务
  3. H3C路由器交换机配置 操作系统命令
  4. VIP服务器间转送文件,vip服务器
  5. Ubuntu远程SSH连接与远程桌面连接
  6. gayhub(github)上不去?一个小tip,比XX上网都快
  7. [056] 微信公众平台开发视频教程全面来袭
  8. 阶段性小结(一)---R语言回归案例实战算法比较
  9. 存储之Block-MultiQueue机制详解(二)
  10. intel CPU集显ID速查