1. 多张jpg图片制作GIF
<dependency>
<groupId>com.madgag</groupId>
<artifactId>animated-gif-lib</artifactId>
<version>1.4</version>
</dependency>
或者
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.6</version>
</dependency>
示例:
/** 方式1,已有jpg格式图片 **/ BufferedImage image1 = ImageIO.read(new File("C:\\Users\\zjy\\Desktop\\1.jpg")); BufferedImage image2 = ImageIO.read(new File("C:\\Users\\zjy\\Desktop\\2.jpg")); BufferedImage image3 = ImageIO.read(new File("C:\\Users\\zjy\\Desktop\\3.jpg")); BufferedImage image4 = ImageIO.read(new File("C:\\Users\\zjy\\Desktop\\4.jpg")); AnimatedGifEncoder e = new AnimatedGifEncoder(); // 生成的图片路径 e.start(new FileOutputStream("C:\\Users\\zjy\\Desktop\\t.gif")); // 图片宽高 e.setSize(600, 300); // 图片之间间隔时间 e.setDelay(1000); // 重复次数 0表示无限重复 默认不重复 e.setRepeat(0); // 添加图片进去 e.addFrame(image1); e.addFrame(image2); e.addFrame(image3); e.addFrame(image4); e.finish();
2.自定义制作GIF动图
示例:
/** 2方式 系统创建图片生成gif **/ AnimatedGifEncoder encoder = new AnimatedGifEncoder(); encoder.start("C:\\Users\\zjy\\Desktop\\y.gif"); encoder.setTransparent(Color.WHITE); encoder.setRepeat(0); encoder.setDelay(80); BufferedImage img = new BufferedImage(400, 360, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = img.createGraphics(); for (int i = 0; i < 100; i++) { g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, 400, 360); g2d.setColor(Color.BLUE); g2d.drawOval(0, i, 200, 200); encoder.addFrame(img); } g2d.dispose(); encoder.finish();
3.视频文件生成GIF动图
ws.schild是基于ffmpeg的java工具包,是目前主流的对视频和音频进行转码、裁剪以及提取操作的java工具包。
pom依赖
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 根据系统二选一 -->
<!-- win系统 -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>3.3.1</version>
</dependency>
<!-- linux系统 -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux64</artifactId>
<version>3.3.1</version>
</dependency>
或者
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.3.1</version>
</dependency>
示例:
public class TestMediaMakeGif { // 输出格式 private static final String outputFormat = "gif"; public static void main(String[] args) { batchTransform("C:\\Users\\zjy\\Desktop\\video", "C:\\Users\\zjy\\Desktop\\video"); } /** * 获得转化后的文件名 * * @param sourceFilePath : 源视频文件路径 * @return */ public static String getNewFileName(String sourceFilePath) { File source = new File(sourceFilePath); String fileName = source.getName().substring(0, source.getName().lastIndexOf(".")); return fileName + "." + outputFormat; } /** * 转化音频格式 * @param sourceFilePath : 源视频文件路径 * @param targetFilePath : 目标gif文件路径 */ public static void transform(String sourceFilePath, String targetFilePath) { File source = new File(sourceFilePath); File target = new File(targetFilePath); try { // 获得原视频的分辨率 MultimediaObject mediaObject = new MultimediaObject(source); MultimediaInfo multimediaInfo = mediaObject.getInfo(); VideoInfo videoInfo = multimediaInfo.getVideo(); VideoSize sourceSize = videoInfo.getSize(); // 设置视频属性 VideoAttributes video = new VideoAttributes(); video.setCodec(outputFormat); // 设置视频帧率 正常为10 ,值越大越流畅 video.setFrameRate(100); // 设置视频分辨率 VideoSize targetSize = new VideoSize(sourceSize.getWidth() / 2, sourceSize.getHeight() / 2); video.setSize(targetSize); // 设置转码属性 EncodingAttributes attrs = new EncodingAttributes(); attrs.setVideoAttributes(video); // 音频转换格式类 Encoder encoder = new Encoder(); encoder.encode(mediaObject, target, attrs); System.out.println("制作完成"); } catch (EncoderException e) { e.printStackTrace(); } } /** * 转化视频格式 * @param sourceFolderPath : 源视频文件夹路径 * @param targetFolderPath : 目标gif文件夹路径 */ public static void batchTransform(String sourceFolderPath, String targetFolderPath) { File sourceFolder = new File(sourceFolderPath); if (sourceFolder.list().length != 0) { Arrays.asList(sourceFolder.list()).forEach(e -> { transform(sourceFolderPath + "\\" + e, targetFolderPath + "\\" + getNewFileName(e)); }); } } }