程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

由png生成Gif

发布于2020-11-19 20:47     阅读(502)     评论(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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)