java根据jpg格式图片或视频文件生成gif动图

本文介绍了使用Java编程实现GIF动态图的三种方式:1)将多张jpg图片合并成GIF;2)自定义绘制内容生成GIF;3)从视频文件中提取生成GIF。通过引入不同的库如animated-gif-lib和jave,提供了详细的代码示例来说明如何操作。
摘要由CSDN通过智能技术生成

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));
            });
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值