发布于2020-11-19 20:47 阅读(628) 评论(0) 点赞(26) 收藏(2)
由所获得的图片生成Gif的主要操作流程:
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.setRepeat(0);
e.start(gif);
//gif为String 格式应为xxx目录下后缀名为.gif的完全路径 如:D:\desktop\2.gif
//这句语句会在对应位置生成一个gif文件并且对其进行编辑
BufferedImage src = (BufferedImage)ImageIO.read(png);
e.setDelay(playtime);
e.addFrame(src);
//这串语句通常在一个循环里,png为png图像文件的路径,playtime为gif播放时每张图片的持续时间,addFrame就是将src所获取的图像加到帧中
上述由AnimatedGifEncoder,LZWEncoder,NeuQuant
三个类及其方法实现。
程序中包含对目录中文件的排序:
List<File> fl = Arrays.asList(new File(pic).listFiles());
Collections.sort(fl, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return o1.getName().compareTo(o2.getName());
}
});
首先fl为按路径pic生成的File数组,利用Collections类下的sort方法,自己手动编辑一种排序方法并用于fl的排序。
工具齐全之后,开始着手实际实现:我们的目的是由用户输入一个获取png的路径,以及一个生成gif的目录路径,生成的gif名称为该gif所需要的png图片的获取目录文件夹名称。
首先获取pic路径下的所有文件及文件夹生成一个数组,对其中文件及文件夹操作不同。
文件夹:采取当前函数递归调
文件:直接利用生成gif的工具即可。
编程中遇到的问题:
①StringBuilder newgifBuilder = new StringBuilder(gif).append("\\").append(new File(pic).getName());
在获取到gif路径,调用函数前,需要在gif路径后增加pic文件夹名称
②gif = gif.replace(new File(gif).getName(), new File(pic).getName());
因为递归后获取图片的目录改变,所生成的gif名称也应该改变
全部代码:
package gif;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import javax.imageio.ImageIO;
public class Gif {
public static void main(String[] args) throws IOException {
String pic;
String gif;
String bool;
int time = 0;
int playtime = 200;
Scanner sc = new Scanner(System.in);
System.out.println("png路径:");
pic = sc.next();
System.out.println("是否改变生成gif的路径(默认当前文件夹)(Y/N):");
bool = sc.next();
if ("Y".equals(bool)) {
System.out.println("新路径:");
gif = sc.next();
} else {
gif = pic;
}
sc.close();
StringBuilder newgifBuilder = new StringBuilder(gif).append("\\").append(new File(pic).getName());
gif = newgifBuilder.toString();
jpgToGif(pic, gif, playtime, time, bool);
System.out.println("done");
}
private static void jpgToGif(String pic, String gif, int playtime, int time, String bool) throws IOException {
AnimatedGifEncoder e = new AnimatedGifEncoder();
List<File> fl = Arrays.asList(new File(pic).listFiles());
if (0 != time) {
gif = gif.replace(new File(gif).getName(), new File(pic).getName());
}
StringBuilder newgifBuilder = new StringBuilder(gif).append(".gif");
String gp = newgifBuilder.toString();
Collections.sort(fl, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return o1.getName().compareTo(o2.getName());
}
});
e.setRepeat(0);
e.start(gp);
for(File sf : fl) {
if (sf.isDirectory()) {
StringBuilder newpicpath = new StringBuilder(pic).append("\\").append(sf.getName());
String newpic = newpicpath.toString();
time++;
jpgToGif(newpic, gp, playtime, time, bool);
}
if (sf.getName().endsWith(".png")) {
BufferedImage src = (BufferedImage)ImageIO.read(sf);
e.setDelay(playtime);
e.addFrame(src);
}
}
}
}
原文链接:https://blog.csdn.net/MagicSound/article/details/109776390
作者:你不要惹我
链接:http://www.javaheidong.com/blog/article/1013/eca18607b98ea86fc8cb/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!