工作中, gif动图转图片/图片集转gif
pom依赖很简单
<!-- gif -->
<dependency>
<groupId>com.madgag</groupId>
<artifactId>animated-gif-lib</artifactId>
<version>1.4</version>
</dependency>
简单的工具类实现
import com.madgag.gif.fmsware.AnimatedGifEncoder;
import com.madgag.gif.fmsware.GifDecoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class GifOperator {
public static void main(String[] args) throws IOException {
String outputPath = "/home/lab/test/001.gif";
String imagePath = "/home/lab/test/33.gif";
reverseGif(imagePath,outputPath);
// Gif转图片
String dirPath = "/home/lab/test/22/";
gifToImages(imagePath,dirPath);
List<BufferedImage> images = new ArrayList<>();
for (int i = 0 ; i < 111;i++) {
File outFile = new File(dirPath + i + ".png");
BufferedImage image = ImageIO.read(outFile);
images.add(image);
}
imagesToGif(images,"/home/lab/test/res.gif");
}
/**
* 多图片转gif
* @param imageList
* @param outputPath
* @throws IOException
*/
static void imagesToGif(List<BufferedImage> imageList, String outputPath) throws IOException {
// 拆分一帧一帧的压缩之后合成
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.start(outputPath);
encoder.setRepeat(0);
for (BufferedImage bufferedImage :
imageList) {
encoder.setDelay(100);
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
BufferedImage zoomImage = new BufferedImage(width, height, 3);
Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
Graphics gc = zoomImage.getGraphics();
gc.setColor(Color.WHITE);
gc.drawImage(image, 0, 0, null);
encoder.addFrame(zoomImage);
}
encoder.finish();
File outFile = new File(outputPath);
BufferedImage image = ImageIO.read(outFile);
ImageIO.write(image, outFile.getName(), outFile);
}
/**
* Gif转图片集
* @param imagePath
* @param outputDirPath
* @throws IOException
*/
static void gifToImages(String imagePath,String outputDirPath) throws IOException {
GifDecoder decoder = new GifDecoder();
int status = decoder.read(imagePath);
if (status != GifDecoder.STATUS_OK) {
throw new IOException("read image " + imagePath + " error!");
}
for (int i = 0; i < decoder.getFrameCount();i++) {
BufferedImage bufferedImage = decoder.getFrame(i);// 获取每帧BufferedImage流
File outFile = new File(outputDirPath + i + ".png");
ImageIO.write(bufferedImage, "png", outFile);
}
}
/**
* 视频倒放
* @param imagePath
* @param outputPath
* @throws IOException
*/
public static void reverseGif(String imagePath,String outputPath) throws IOException {
GifDecoder decoder = new GifDecoder();
int status = decoder.read(imagePath);
if (status != GifDecoder.STATUS_OK) {
throw new IOException("read image " + imagePath + " error!");
}
// 拆分一帧一帧的压缩之后合成
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.start(outputPath);
encoder.setRepeat(decoder.getLoopCount());
for (int i = decoder.getFrameCount() -1; i >= 0; i--) {
encoder.setDelay(decoder.getDelay(i));// 设置播放延迟时间
BufferedImage bufferedImage = decoder.getFrame(i);// 获取每帧BufferedImage流
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
BufferedImage zoomImage = new BufferedImage(width, height, bufferedImage.getType());
Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
Graphics gc = zoomImage.getGraphics();
gc.setColor(Color.WHITE);
gc.drawImage(image, 0, 0, null);
encoder.addFrame(zoomImage);
}
encoder.finish();
File outFile = new File(outputPath);
BufferedImage image = ImageIO.read(outFile);
ImageIO.write(image, outFile.getName(), outFile);
}
}