官网: 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() {
@Override
public void run() {
// todo 预处理
cdl.countDown();
}
});
}
logger.info("等待图片预处理完成");
cdl.await();
String gifPath = String.join(File.separator,deploySceneDir,"poster.gif");
// 拼接gif
es.submit(new Runnable() {
@Override
public 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;
}