document.write("");

java 将指定文件夹内的所有图片 拼接为gif

引入依赖

1
2
3
4
5
<dependency>
    <groupId>com.github.jai-imageio</groupId>
    <artifactId>jai-imageio-core</artifactId>
    <version>1.4.0</version>
</dependency>

工具类

指定图片文件夹,指定生成的gif文件全名路径(可使用本地路径或共享路径)

可指定每帧延迟时间(调整一下,可以设定每一帧的延迟时间)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
 
public class GifCreator {
 
    /**
     * 将指定文件夹内的所有图片拼接成一个 GIF 文件。
     *
     * @param inputFolder 输入文件夹路径
     * @param outputGif   输出 GIF 文件路径
     * @param delay       每帧之间的延迟时间(单位:毫秒)
     * @throws IOException 如果读取或写入文件时发生错误
     */
    public static void createGifFromImages(String inputFolder, String outputGif, int delay) throws IOException {
        File folder = new File(inputFolder);
        File[] files = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png") || name.toLowerCase().endsWith(".jpg"));
 
        if (files == null || files.length == 0) {
            throw new IOException("No image files found in the specified folder.");
        }
 
        // 按文件名排序,要求文件名称需要是数值
        Arrays.sort(files, Comparator.comparingDouble(f-> {
            String name = f.getName();
            return Double.parseDouble(name.substring(0, name.indexOf(".")));
        }));
 
        ImageWriter writer = ImageIO.getImageWritersByFormatName("gif").next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(new File(outputGif));
        writer.setOutput(ios);
 
        // 创建元数据
        IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB), null);
        // 设置每帧的延迟时间
        setDelayTime(metadata, delay);
        // 开始写入序列
        writer.prepareWriteSequence(metadata);
 
        for (File file : files) {
            BufferedImage image = ImageIO.read(file);
            System.out.println("当前写入图片:" + file.getName());
            writer.writeToSequence(new javax.imageio.IIOImage(image, null, metadata), null);
        }
 
        // 结束写入序列
        writer.endWriteSequence();
        writer.dispose();
        ios.close();
    }
 
    /**
     * 设置每帧的延迟时间。
     *
     * @param metadata 元数据对象
     * @param delay    每帧之间的延迟时间(单位:毫秒)
     */
    private static void setDelayTime(IIOMetadata metadata, int delay) throws IIOInvalidTreeException {
        String metaFormatName = metadata.getNativeMetadataFormatName();
        IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metaFormatName);
 
        IIOMetadataNode graphicsControlExtensionNode = new IIOMetadataNode("GraphicControlExtension");
        graphicsControlExtensionNode.setAttribute("disposalMethod", "none");
        graphicsControlExtensionNode.setAttribute("userInputFlag", "false");
        graphicsControlExtensionNode.setAttribute("transparentColorFlag", "false");
        graphicsControlExtensionNode.setAttribute("delayTime", Integer.toString(delay / 10)); // 单位是1/100秒
        graphicsControlExtensionNode.setAttribute("transparentColorIndex", "0");
 
        root.appendChild(graphicsControlExtensionNode);
        metadata.setFromTree(metaFormatName, root);
    }
    public static void main(String[] args) {
        try {
            // 设定本地文件路径
//            String inputFolder = "D:/test/c";
//            String outputGif = "D:/test/g/e.gif";
            // 设定共享文件夹路径
            String inputFolder = "//ip/Users/Public/共享文件/xxx/source";
            String outputGif = "//ip/Users/Public/共享文件/xxx/gif/test.gif";
            int delay = 5000; // 每帧之间的延迟时间(单位:毫秒)
            createGifFromImages(inputFolder, outputGif, delay);
            System.out.println("GIF created successfully at " + outputGif);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  

posted @   人间春风意  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示

距今时间:
1018天1.00 小时 38.31 分钟

当前新增阅读数:139507