我找到了this,它适用于我试过的一个gif.

我不知道他到底在做什么,但是看起来如果第一帧的延迟为0它会覆盖所有帧的延迟为10.然后他在内存中“写入”一个新的GIF文件并将其加载到图片.

[编辑]我把它打磨了一下并解决了这些错误.

>没有专有API

>不只是检查第一帧以确定它是否被窃听,

>仅对其为零的帧替换延迟.

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 coin介绍_代码示例中的Java 7:Project Coin

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. java字符串数组排序_在Java中对字符串数组进行排序

    允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...

  9. java 异常对象_在java中的异常处理中的异常对象是什么

    展开全部 Exception类以及他的子类 的一个实例对象 比如32313133353236313431303231363533e58685e5aeb931333264633563 常见异常 1. j ...

最新文章

  1. 使用json-server搭建模拟api接口
  2. node.js 执行php,node.js - 如何利用php执行nodejs文件
  3. 京东到家 415同城购物节开启中百仓储武汉门店单日破千单
  4. nodejs mysql 同步_NodeJS实现同步的方法
  5. 编译opencv错误解决:libavcodec.a(hevc_cabac.o): `ff_h264_cabac_tables' can not be used
  6. vimpython配色_你认为最好看的 Vim 配色方案(color scheme)是哪款?
  7. 磁珠 符号_史上最全面的磁珠知识大全
  8. 光学中的几个物理量的意义
  9. OVER(PARTITION BY)函数介绍
  10. SPSS Modeler 数据整理之变量设定 (指南 第三章)
  11. 列表求和python_python列表求和
  12. ABAP对excel的操作(合并单元格,设置边框)
  13. html5获取蓝牙设备列表,【报Bug】官方H5+示例中 搜索蓝牙设备,部分机型搜索不到任何蓝牙...
  14. SDL的教学(如何用sdl图形化以及sdl的使用思路)
  15. window服务如何通过程序如何打开谷歌浏览器并登陆指定网站_亚马逊如何看listing销量,亚马逊如何看销量排名...
  16. 彻底搞懂数据库中的超码,候选码,主码,主属性,非主属性,全码的区别
  17. 5、无线传输和卫星通信(物理层)
  18. Vue中使用使用内联样式
  19. 2020年高级工程师职称评审必备条件!
  20. 「二分类算法」提供银行精准营销解决方案

热门文章

  1. 关于微信公众号注意事项
  2. Java IO 流 学习 总结
  3. appJSON[tabBar][0][pagePath] pages/basics/basics 需在 pages 数组中
  4. mysql 查看表结构,字段的基本信息(简单明了)。
  5. Phos 技术服务支持
  6. RelativeLayout布局,不希望文本盖住其他组件
  7. .net2.0网站多语言
  8. SAP Cloud for Customer客户主数据的重复检查-Levenshtein算法
  9. MyBatis - 6.Spring整合MyBatis
  10. Serializable 都这么牛逼了,Parcelable 还要你何用?