java gif 帧_修复Java中动画gif的帧频
仅将延迟替换为零的帧。
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 gif 帧_在Java中修复动画gif的帧速率
我找到了this,它适用于我试过的一个gif. 我不知道他到底在做什么,但是看起来如果第一帧的延迟为0它会覆盖所有帧的延迟为10.然后他在内存中"写入"一个新的GIF文件并将其加载 ...
- 计算机中丢失msc,mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll
mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll mscvr120.dll是系统的非常重要的一个文件,相信很多的人都是遇到文件丢失的情况,这个时候就需要你在下载一个d ...
- 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上运行编译类时.我使用的是一个非 ...
最新文章
- 今天遇到一个很奇怪的问题,XP系统屏幕全部旋转90度
- 【FI模块学习笔记】 固定资产概述(上)
- logback基础配置文件
- 小米登录协议分析_小米温湿度传感器协议分析
- 【Java】递归删除文件目录
- 7 学大厂,拓展基础组件封装思路 BAT?TMD
- 2015/6/9 站立会议以及索引卡更新
- ofo给还在路上垂死挣扎的战友们留下什么启示?
- Datawhale 202210 Excel | 第五、六、七章 Excel函数示例 Excel函数列表
- python移动文件夹下所有文件到另一个文件夹
- 硬件设计——一键开关机
- Julia 安装,使用教程
- 谷歌广告投放,谷歌广告怎么投放?
- TERMIN汤铭,FE8.1芯片一进四出扩展坞(HUB)集线器芯片。
- 密码加盐原理及其实现
- 第三届进博会倒计时100天,欧莱雅、雅诗兰黛、爱茉莉太平洋积极筹备参展 | 美通企业日报...
- 非视线成像:角膜成像系统
- 机器视觉丨环形无影光源丨原理及打光案例
- Doxygen使用指南,Doxygen介绍一
- Elasticsearch:Rank feature query - 排名功能查询