首页 > 编程语言 >java 将指定文件夹内的所有图片 拼接为gif

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

时间:2024-12-30 16:54:19浏览次数:1  
标签:imageio String delay gif 文件夹 import java javax metadata

引入依赖

        <dependency>
            <groupId>com.github.jai-imageio</groupId>
            <artifactId>jai-imageio-core</artifactId>
            <version>1.4.0</version>
        </dependency>

工具类

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

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

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();
        }
    }
}

  

标签:imageio,String,delay,gif,文件夹,import,java,javax,metadata
From: https://www.cnblogs.com/uoky/p/18641702

相关文章

  • Java框架 —— SpringBoot(一)
    简介 SpringBoot是一个开源的Java框架,用于简化Spring应用程序的开发过程。它基于Spring框架,旨在通过自动配置、简化的项目结构以及内嵌的服务器支持,帮助开发者快速构建和部署应用程序。特性自动配置:根据项目的依赖关系自动配置Spring框架内嵌服务器:内嵌Tomcat......
  • Java并发编程为啥这么难学?
    提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程中的可见性、核心业务的原子性、多线程通信的有序性。虽然很多人工作可能接触不到这些的东西,但是面试就是得问。假如......
  • 深入理解Java Lambda表达式及其常用应用
    深入理解JavaLambda表达式及其常用应用在Java8中,Lambda表达式为我们提供了一种简洁且强大的方法来处理函数式编程风格的代码。Lambda表达式让代码更简洁、可读性更强,同时提高了代码的可维护性。在本文中,我们将深入探讨JavaLambda表达式的常见类型、语法和应用场景,帮助你掌握这......
  • java之mybatis框架第一天-mybatis入门
    1.前言什么是mybatisMyBatis是一款优秀的持久层框架,用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。2.mybatis快速入门目标:使用Mybatis查询所有用户数据(1)准备工......
  • 关于Java的静态与非静态引起的问题
    packageStatic.non;publicclassAdd{publicintadd(inta,intb){//这里是非staticreturna+b;}publicstaticintfact(inta){//这里是staticif(a==1){return1;}else{returna*fact(a-1);......
  • java面试题大全及答案
    1、创建线程的三种方式的对比?(1)采用实现Runnable、Callable接口的方式创建多线程。优势是:线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将C......
  • 史上最全Java面试题总结(2025年持续更新.....)
    1.类的线程安全我们经常说类是线程安全的,类是线程不安全的。那么什么样的类才是线程安全的?1.1定义多线程环境下,不管不同的线程如何使用和调度这个类,这个类总是表现出正确的行为。那么这个类就是线程安全的。类的线程安全有两个关键点:1.操作的原子性2.内存的可见性。如......
  • JavaScript开发中常见问题代码和相关优化Demo参考5.0
    41. 过度使用全局状态管理问题代码:在小型项目中引入了复杂的全局状态管理库(如Redux),增加了不必要的复杂性。解决方案:对于小型应用或简单状态管理需求,考虑使用React的useState和useContext,或者Vuex等框架自带的状态管理功能。//使用ReactContextAPIconstThemeContext=......
  • 如何更改云服务器文件夹属性以允许写入操作?
    您好,关于您提到的更改D:\www\kelixchao\www\source\plugin文件夹下的Tom开关文件夹属性的问题,我们理解您的困扰。首先,需要明确的是,文件夹属性中的灰色勾选并不一定表示只读属性。实际上,这些文件夹通常是可读写的。如果您遇到无法写入的情况,可能是由于其他权限或安全设置导致的。......
  • 【已下offer】2024西安华为 Java 面经
    西安华为Java面经​ 写在前面,推荐这个ai面试产品,多面鹅ai,真的很好用。在面试前已经模拟面试准备过很多次,多亏了多面鹅帮我模拟面试还复盘,给了我很大的帮助!还有线上面试同步ai辅助提醒的功能,但是我没用,有用过的小伙伴可以分享一下经验!OfferGoose多面鹅官网- AI面试模......