java gif 帧_在Java中修复动画gif的帧速率
我找到了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的帧速率相关推荐
- java coin介绍_代码示例中的Java 7:Project Coin
java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
- java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创
由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...
- java jar 目录_将Java类路径中的所有jar包括在一个目录中
有没有一种方法可以将所有的jar文件包含在类路径的目录中? 我正在尝试java -classpath lib / *.jar :. my.package.Program,它无法找到当然在这些罐子里的类 ...
- java gradle构建_在Gradle中为JPMS构建Java 6-8库
java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...
- java避免空指针异常_避免Java中的空指针异常
java避免空指针异常 空指针异常是Java中最常见,最烦人的异常. 在这篇文章中,我想避免这种不希望的异常. 首先让我们创建引发空指针异常的示例 private Boolean isFinished ...
- ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home
我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...
- java字符串数组排序_在Java中对字符串数组进行排序
允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...
- java 异常对象_在java中的异常处理中的异常对象是什么
展开全部 Exception类以及他的子类 的一个实例对象 比如32313133353236313431303231363533e58685e5aeb931333264633563 常见异常 1. j ...
最新文章
- 使用json-server搭建模拟api接口
- node.js 执行php,node.js - 如何利用php执行nodejs文件
- 京东到家 415同城购物节开启中百仓储武汉门店单日破千单
- nodejs mysql 同步_NodeJS实现同步的方法
- 编译opencv错误解决:libavcodec.a(hevc_cabac.o): `ff_h264_cabac_tables' can not be used
- vimpython配色_你认为最好看的 Vim 配色方案(color scheme)是哪款?
- 磁珠 符号_史上最全面的磁珠知识大全
- 光学中的几个物理量的意义
- OVER(PARTITION BY)函数介绍
- SPSS Modeler 数据整理之变量设定 (指南 第三章)
- 列表求和python_python列表求和
- ABAP对excel的操作(合并单元格,设置边框)
- html5获取蓝牙设备列表,【报Bug】官方H5+示例中 搜索蓝牙设备,部分机型搜索不到任何蓝牙...
- SDL的教学(如何用sdl图形化以及sdl的使用思路)
- window服务如何通过程序如何打开谷歌浏览器并登陆指定网站_亚马逊如何看listing销量,亚马逊如何看销量排名...
- 彻底搞懂数据库中的超码,候选码,主码,主属性,非主属性,全码的区别
- 5、无线传输和卫星通信(物理层)
- Vue中使用使用内联样式
- 2020年高级工程师职称评审必备条件!
- 「二分类算法」提供银行精准营销解决方案
热门文章
- 关于微信公众号注意事项
- Java IO 流 学习 总结
- appJSON[tabBar][0][pagePath] pages/basics/basics 需在 pages 数组中
- mysql 查看表结构,字段的基本信息(简单明了)。
- Phos 技术服务支持
- RelativeLayout布局,不希望文本盖住其他组件
- .net2.0网站多语言
- SAP Cloud for Customer客户主数据的重复检查-Levenshtein算法
- MyBatis - 6.Spring整合MyBatis
- Serializable 都这么牛逼了,Parcelable 还要你何用?