我是靠谱客的博主 舒适蛋挞,最近开发中收集的这篇文章主要介绍java使用metadata-extractor获取图片的日期信息java使用metadata-extractor获取图片的日期信息,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java使用metadata-extractor获取图片的日期信息

metadata-extractor是一个开源的Java库,用于从媒体文件中读取元数据。

首先放上metadata-extractor的github地址,上面有java调用的简单介绍。

个人是用来将文件名字统一处理为创建时间(拍摄时间):

  1. 如果能够获取exfi信息,使用exfi信息中的创建时间;
  2. 否则,使用文件的最后一次修改时间;
  3. 否则,使用当前时间;
  4. 如果出现metadata-extractor无法解析的文件格式,则不作处理。

下面是自己写的方法,首先获取文件metadata对象,然后使用getDate()方法返回“yyyy-MM-dd-HHmmss”格式的日期时间字符串。

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.ExifDirectoryBase;
import com.drew.metadata.exif.ExifSubIFDDirectory;
import com.drew.metadata.file.FileSystemDirectory;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
/**
*
* <h2>获取图片或其他文件的日期信息</h2>
* <p>
* 若存在exfi信息,使用exfi时间信息,否则使用文件修改时间,否则使用当前日期
* 若文件类型无法解析,使用原本的文件名
* </p>
*
* @author qizidog
*/
@SpringBootTest
public class KiftdCtlTest {
@Test
public void getExifInfo() {
String path = System.getProperty("user.dir");
File pic1 = new File(path + "/2021-01-17-182847.heic");
File pic2 = new File(path + "/2021-01-29-180837.heic");
File pic3 = new File(path + "/IMG_3076.PNG");
File pic4 = new File(path + "/IMG_3256.JPG");
File pic5 = new File(path + "/IMG_3659.PNG");
File pic6 = new File(path + "/IMG_3660.JPG");
File video = new File(path + "/IMG_3559.mp4");
LinkedList<File> files = new LinkedList<>();
files.add(pic1);	files.add(pic2);
files.add(pic3);	files.add(pic4);
files.add(pic5);	files.add(pic6);
files.add(new File("123.123123"));
files.add(new File(path + "/123.txt"));
files.add(video);
for (File file : files) {
try {
Metadata metadata = ImageMetadataReader.readMetadata(file);
String date = getDate(metadata);
System.out.println(date);
} catch (ImageProcessingException e) {
System.out.println(file.getName());
System.out.println("无法解析的文件类型,直接使用原始文件名");
} catch (IOException e) {
e.printStackTrace();
} finally {
// todo 修改文件名字,或者返回一个File类型对象/输出流
}
}
}
public String getDate(Metadata metadata){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss");
String date0 = dtf.format(LocalDateTime.now());
if (metadata==null){
return date0;
}
// 如果能够获取exfi的日期数据,以该日期为准
ExifDirectoryBase exifDir = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
if (exifDir!=null) {
date0 = exifDir.getString(ExifDirectoryBase.TAG_DATETIME_ORIGINAL);
if (date0 != null) {
String[] s = date0.split(" ");
return s[0].replace(":", "-") + '-' + s[1].replace(":", "");
}
}
// 否则以文件修改时间为准
FileSystemDirectory fileDir = metadata.getFirstDirectoryOfType(FileSystemDirectory.class);
if (fileDir!=null) {
Object o = fileDir.getObject(FileSystemDirectory.TAG_FILE_MODIFIED_DATE);
if (o != null) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HHmmss");
try {
date0 = df.format(o);
} catch (IllegalArgumentException e) {
// 如果是个不清楚的日期类型,返回该类型的toString结果
date0 = o.toString();
System.out.println(o.getClass());
System.out.println(fileDir.getString(FileSystemDirectory.TAG_FILE_NAME) + ": " + date0);
}
return date0;
}
}
// 如果什么时间信息都没有获取到,返回当前时间
System.out.println("无法获取资源时间相关信息,使用当前时间...");
return dtf.format(LocalDateTime.now());
}
// 查看文件所有信息
// @Test
public void printAll(File file) throws ImageProcessingException, IOException {
Metadata metadata = ImageMetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
System.out.println(tag);
}
}
}
}

最后

以上就是舒适蛋挞为你收集整理的java使用metadata-extractor获取图片的日期信息java使用metadata-extractor获取图片的日期信息的全部内容,希望文章能够帮你解决java使用metadata-extractor获取图片的日期信息java使用metadata-extractor获取图片的日期信息所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部