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(); } } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析