当前位置: 首页 > news >正文

使用ImageMagick实现多张图片拼接为gif(多线程版)

官网: https://imagemagick.org/

直接上代码

ExecutorService es = Executors.newFixedThreadPool(10);
List<File> images = getImageFiles(sceneDir);
CountDownLatch cdl = new CountDownLatch(images.size());
// 拷贝图片
for (File file : images) {System.out.println(file.getPath());final File dstImage = new File(deploySceneImageDir, file.getName());es.submit(new Runnable() {@Overridepublic void run() {// todo 预处理cdl.countDown();}});
}logger.info("等待图片预处理完成");
cdl.await();
String gifPath = String.join(File.separator,deploySceneDir,"poster.gif");
// 拼接gif
es.submit(new Runnable() {@Overridepublic void run() {toGif(new File(deploySceneImageDir),gifPath,delay,0);}
});
logger.info("完成图片的处理");
es.shutdown();

checker

public boolean toGif(File srcDir, String outputImagePath,int delay,int loop){File[] files = srcDir.listFiles();if(files == null){return false;}int gifExpectSize = 0;List<String> images = new ArrayList<>();for (File file : files) {images.add("\""+file.getPath()+"\"") ;// 处理“convert: unable to open image”问题gifExpectSize += file.length();}System.out.println("期望的gif大小:"+(gifExpectSize/1024.0/1024.0)+"M");String imagePaths = String.join(" ",images);return toGif(imagePaths,outputImagePath,delay,loop);}

toGif方法

public boolean toGif(String inputImagePath, String outputImagePath,int delay,int loop){List<String> command = new ArrayList<>();// -delay参数应该在输入图像之前指定command.add("-delay");// 指定每一帧之间的延迟时间(以毫秒为单位),这里是100毫秒。command.add(delay+"");command.add(inputImagePath);command.add("-loop");command.add(loop+"");command.add(outputImagePath);return execute(command);}

execute方法

public boolean execute(List<String> command) {command.add(0,convertPath);try {String execCommand = Arrays.toString(command.toArray()).replace(",","").replace("[","").replace("]","");System.out.println("图像处理命令:"+execCommand);// 执行命令ProcessBuilder pb = new ProcessBuilder(command);Process process = pb.start();// 处理标准错误流BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line;while ((line = errorReader.readLine()) != null) {System.err.println(line);}// 等待命令执行完成int exitCode = process.waitFor();return  exitCode == 0;} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return false;}
public List<File> getImageFiles(String sceneDir){List<File> ret = new ArrayList<>();if (new File(sceneDir).listFiles() == null) {return ret;}for (File file : new File(sceneDir).listFiles()) {if(file.getName().endsWith(".JPG")){ret.add(file);}}return ret;}

相关文章:

使用ImageMagick实现多张图片拼接为gif(多线程版)

官网: https://imagemagick.org/ 直接上代码 ExecutorService es Executors.newFixedThreadPool(10); List<File> images getImageFiles(sceneDir); CountDownLatch cdl new CountDownLatch(images.size()); // 拷贝图片 for (File file : images) {System.out.prin…...

解释 RESTful API,以及如何使用它构建 web 应用程序。

RESTful API是一种利用HTTP协议进行通信的Web API设计风格&#xff0c;它采用了一组统一且可缓存的操作&#xff0c;包括GET、POST、PUT、DELETE等&#xff0c;通过URL来定位资源&#xff0c;以及使用JSON、XML等格式来传输数据&#xff0c;以实现系统之间的数据交互和资源共享…...

远程端口转发 实践 如何将物理机某一端口的服务转发到vps上,使得外网能访问到

以本机1470端口&#xff08;我的sqli-labs&#xff09;与vps的9023端口为例。 SSH基本的连接命令是&#xff1a; ssh usernamehostname这里牵扯到了两台主机&#xff0c;一是执行命令、运行SSH客户端的主机&#xff0c;我们称为本地主机A【Host A】&#xff1b;二是接收连接请…...

【uniapp 监听键盘弹起与收回】

在uniapp中&#xff0c;可以通过使用小程序提供的API来监听键盘弹起与收回。 首先&#xff0c;在页面的onLoad函数中注册监听事件&#xff1a; onLoad() {uni.onKeyboardHeightChange(this.onKeyboardHeightChange); },然后&#xff0c;在页面的onUnload函数中取消注册监听事…...

【Unity】如何制作小地图

我们为什么要制作小地图呢&#xff1f; 原因很简单&#xff1a; 导航和定位&#xff1a;小地图可以显示玩家当前位置以及周围环境的概览。这使得玩家能够更好地导航和定位自己在游戏中的位置&#xff0c;找到目标或避开障碍物。场景了解&#xff1a;通过小地图&#xff0c;玩…...

基于IMX6ULLmini的linux裸机开发系列八:按键处理实验

目录 GIC相关寄存器 GPIO中断相关寄存器 中断服务函数表 中断向量表偏移位置 make有报错 解决方法&#xff1a;error: for loop initial declarations are only allowed in C99 mode_‘for’ loop initial declarations are only allowed i_Young_2717的博客-CSDN博客 GIC…...

数据结构好题总结

Cut Inequality Down 题解 https://blog.csdn.net/lzh_naive/article/details/103340568 概括&#xff1a;st表倍增类st表 考虑如果没有UL限制的话&#xff0c;相当于是前缀和 我们发现&#xff0c;如果某次到了U/L&#xff08;相当于是一次碰壁&#xff09;那么这个值已知…...

Java串口开发

网上搜索了关于java串口开发的资料,发现都不是特别的全,故写下一些心得以帮助其他人能快速上手java串口开发,如有错漏之处&#xff0c;敬请指正 串口开发会用到一个javax.comm和RXTXcomm库,&#xff0c;javax.comm库不支持64位操作系统。该库仅适用于32位操作系统,所以接下来主…...

Python nohup 启动python脚本,后台没有日志

一、情况 1.linux上运行python脚本&#xff0c;前台运行打印日志&#xff0c;后台使用nohup不打印日志。 前台运行 ./xxx.py 后台运行 nohup python ./xxx.py > xxx.log 2>&1 &二、排查思路 2.1 脚本是否有问题 首先看自己写的python脚本是否存在问题。因为…...

完美解决微信小程序使用复选框van-checkbox无法选中

由于小程序使用了vant-ui框架&#xff0c;导致checkbox点击无法选中问题 <van-checkbox value"{{ checked }}" shape"square"><view class"check-content"><view class"checktext">我已阅读并同意>《用户协议》…...

IDEA报错:类文件具有错误的版本 61.0,应为52.0

springboot项目启动报错&#xff1a; 类文件具有错误的版本 61.0,应为52.0 请删除该文件或确保该文件位于正确的类路径子目录中 查阅了网上的很多资料&#xff0c;普遍原因说是springboot版本过高&#xff0c;高于3.0 需要在pom文件中降低版本 也有说是idea的maven配置java版…...

Linux 挂载局域网内共享目录

Linux 挂载局域网内共享目录 1、安装samba服务端2、samba服务端配置3、添加samba服务访问账户4、防火墙5、重启服务6、windows访问7、linux访问 1、安装samba服务端 sudo apt-get install -y samba yum install -y samba2、samba服务端配置 vim /etc/samba/smb.conf在文档尾部…...

FFmpeg解码32k大分辨率出现如下错误:Picture size 32768x32768 is invalid

最近找到一张32k的jpeg图片&#xff0c;尝试用ffmpeg来进行解码&#xff0c;命令如下&#xff1a; ffmpeg -i enflame_32768-32768-420.jpg 32.yuv结果出现Picture size 32768x32768 is invalid的错误&#xff1a; 找到报错的代码文件imgutils.c&#xff0c;以及函数&#x…...

EasyExcel+POI制作带有有效性校验及下拉联动的Excel模板

文章目录 1.背景2.实现功能的Excel特性2.1.特性介绍2.2.下拉框联动2.3.单元格自动匹配Id2.4.错误提示 3.代码实现3.1.基础流程代码3.2.名称管理器配置3.3.有效性配置3.4.函数填充3.5.其他补充 4.总结 1.背景 最近在做一个CRM系统的人员销售目标导入的相关需求&#xff0c;需要…...

Unity怎么制作魔法火焰特效?Unity制作魔法火焰特效方法

Unity制作魔法火焰特效方法&#xff1a; 在第一次玩Supergiant Games的RPG游戏《Hades》时&#xff0c;游戏的美术和视觉效果让人非常吃惊。受此启发&#xff0c;希望能够尝试制作类似风格的作品。 工作流程 整个工作从制作简单的火焰贴图开始。首先&#xff0c;我使用PhotoS…...

双基证券:房地产基本面仍处下行通道 政策有望促进走稳

摘要 【双基证券&#xff1a;房地产基本面仍处下行通道 方针有望促进走稳】双基证券表明&#xff0c;2023年5、6、7月商品房及二手房销量继续走弱&#xff0c;引发商场关注。咱们从各城市环线、住所户型、小区物业费的维度盯梢了房地产出售数据的走势&#xff0c;当前新房出售…...

31、springboot 配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口

配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口 ★ 设置HTTP服务端口&#xff1a; - server.port或者SERVER_PORT环境变量——总结来说&#xff0c;其实就是要配置server.port外部配置属性。▲ 同样遵守如下优先级&#xff1a; 这些都是外部配置源&#x…...

会计如何使用ChatGPT提高工作效率

文章目录 ChatGPT改变了会计行业微软重新定义了PC交互应对ChatGPT带来的冲击给财务人员的建议总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社…...

【TypeScript】类型推论和类型别名

类型推断 TypeScript 的类型推断是一种编译器能够自动分析代码并确定变量的类型的功能。它允许你在声明变量时省略类型注释&#xff0c;让 TypeScript 根据变量的值来推断出合适的类型。 以下是 TypeScript 类型推断的一些示例和情况&#xff1a; 基本类型推断&#xff1a; …...

字节码调教的入口 —— JVM 的寄生插件 javaagent 那些事

Java Instrumentation 包 Java Instrumentation 概述 Java Instrumentation 这个技术看起来非常神秘&#xff0c;很少有书会详细介绍。但是有很多工具是基于 Instrumentation 来实现的&#xff1a; APM 产品: pinpoint、skywalking、newrelic、听云的 APM 产品等都基于 Instru…...

SAS协议深度解析:数据中心存储的基石与未来演进

1. 项目概述&#xff1a;SAS协议的现状与未来如果你在数据中心存储领域待过几年&#xff0c;肯定听过一种论调&#xff1a;“SAS&#xff08;Serial Attached SCSI&#xff09;快不行了&#xff0c;NVMe over PCIe才是未来。” 这话听起来挺有道理&#xff0c;毕竟NVMe SSD那动…...

如何快速解锁网易云音乐NCM格式:ncmdumpGUI完整免费解决方案指南

如何快速解锁网易云音乐NCM格式&#xff1a;ncmdumpGUI完整免费解决方案指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样的困扰&…...

Windows触控板手势定制终极指南:3个技巧实现高效三指拖拽优化

Windows触控板手势定制终极指南&#xff1a;3个技巧实现高效三指拖拽优化 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFinger…...

深入解析:NRF24L01如何“伪装”成蓝牙设备?STM32实战代码拆解

深入解析&#xff1a;NRF24L01如何“伪装”成蓝牙设备&#xff1f;STM32实战代码拆解 在物联网设备爆炸式增长的今天&#xff0c;2.4GHz频段已成为无线通信的主战场。NRF24L01作为一款经典的射频芯片&#xff0c;以其低廉的价格和稳定的性能赢得了大量开发者的青睐。而蓝牙技术…...

智慧树刷课插件:3个核心功能帮你告别重复点击,学习效率提升300%

智慧树刷课插件&#xff1a;3个核心功能帮你告别重复点击&#xff0c;学习效率提升300% 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的手动操作…...

Claude代码自动模式:跳过权限的更安全方式 Claude Code auto mode: a safer way to skip permissions —— Anthropic

Claude Code auto mode: a safer way to skip permissions Claude代码自动模式&#xff1a;跳过权限的更安全方式 https://www.anthropic.com/engineering/claude-code-auto-mode Claude Code users approve 93% of permission prompts. We built classifiers to automate so…...

【AI模型治理黄金标准】:SITS 2026认证框架首次披露——覆盖LLM/多模态/SFT模型的8维评估矩阵与23项强制基线

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生模型管理&#xff1a;SITS 2026 MLOps完整解决方案 SITS 2026 是面向AI原生工作负载设计的下一代MLOps平台&#xff0c;深度集成模型生命周期治理、动态推理编排与可信AI审计能力。其核心突破在于…...

SITS 2026闭门工作坊流出的7个LLM推理性能反模式(含3个被主流框架默认启用的致命配置)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生性能优化&#xff1a;SITS 2026 LLM推理加速实战技巧 在 SITS 2026 基准测试中&#xff0c;LLM 推理延迟与显存带宽利用率成为关键瓶颈。AI 原生优化并非简单套用传统 CUDA kernel 调优&#xff…...

Windows下CLion配置NDK的CMake项目,为什么你的Android.toolchain.cmake总报错?一篇讲清所有参数

Windows下CLion配置NDK的CMake项目&#xff1a;破解android.toolchain.cmake报错全指南 当你第一次在CLion中尝试配置NDK的CMake项目时&#xff0c;那个看似简单的android.toolchain.cmake文件可能成了噩梦的开始。明明按照教程一步步操作&#xff0c;却在编译时遭遇各种莫名其…...

2025届必备的降AI率助手实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低那 AI 生成文本所呈现出的机械痕迹&#xff0c;就得从事先规划好的词汇、句法以及逻辑…...