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;

/**
 *
 * 

获取图片或其他文件的日期信息

*

* 若存在exfi信息,使用exfi时间信息,否则使用文件修改时间,否则使用当前日期 * 若文件类型无法解析,使用原本的文件名 *

* * @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)