Java 提取照片的EXIF信息批量重命名

 更新时间:2021年04月23日 09:47:59   作者:攻城狮·正  
这篇文章主要介绍了Java 提取照片的EXIF信息批量重命名的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下

手机或照机拍摄的照片名称通常是”IMG_001.JPG”这种格式,这种文件名称是无意义的。使用照片拍摄时间命名可以让我们在多年以后查找照片时根据文件名就能快速筛选出某一时间段的照片。

原始照片或视频是带有EXIF信息的。这些信息是设备在拍摄时生成,记录了照片的拍摄时间,设备信息,拍摄GPS位置等信息,在文件属性中可以查看到:

图片APP和网盘软件中图片时间线也是提取EXIF信息生成的。如果对照片进行处理,如美化操作,另存为时可能会丢失EXIF信息,或者EXIF信息被改写,会导致识别信息不准。

我以前备份的照片,大多是原始文件名,现在我想根据拍摄日期批量重命名。

找了一圈,发现老牌看图软件ADSee带有这个功能:

但是存在几个问题:

  • 不能排除已丢失EXIF的文件,这类的文件无法重命名
  • 官方ADSee免费版下载安装后,要注册账号才能使用

于是动动手,用JAVA代码实现这个小功能。

提取EXIF信息使用的是开源项目 metadata extractor ,它支持市面上常见的媒体文件格式和设备:

metadata extractor 官网:https://drewnoakes.com/code/exif/

引入依赖:

<dependency>
  <groupId>com.drewnoakes</groupId>
  <artifactId>metadata-extractor</artifactId>
  <version>2.15.0</version>
</dependency>

官方读取示例代码:

Metadata metadata = ImageMetadataReader.readMetadata(file);

for (Directory directory : metadata.getDirectories()) {
    for (Tag tag : directory.getTags()) {
        System.out.format("[%s] - %s = %s \n",
            directory.getName(), tag.getTagName(), tag.getDescription());
    }
    if (directory.hasErrors()) {
        for (String error : directory.getErrors()) {
            System.err.format("ERROR: %s", error);
        }
    }
}

以下是我使用示例代码读取一张图片输出的部分结果:

其中 Date/Time Original 就是我要取的摄像日期。

代码如下:

/**
 * 如果是目录则递归查找
 * @param file 文件或目录
 */
public static void recursion(File file) {
    if (file.isDirectory()) {
        // 目录
        File[] fileList = file.listFiles();
        for (File f : fileList) {
            recursion(f);
        }

    } else {
        // 文件
        if (file.isFile()) {
            // 格式:2019:06:27 11:23:55 或 2019:07:13 19:07:42下午
            String originDateTime = getOriginDateTime(file);
            if (null != originDateTime) {
                int lastDoc = file.getPath().lastIndexOf(".");
                String suffix = file.getPath().substring(lastDoc);
                String fileName = originDateTime.replace("下午", "").replaceAll(":", "-") + suffix;
                File newFile = new File(file.getParentFile(), fileName);
                if (newFile.exists()) {
                    System.out.format("文件【%s】已存在 \n", newFile.getPath());
                } else {
                    System.out.format("重命名【%s】 -> 【%s】 \n", file.getPath(), newFile.getPath());
                    file.renameTo(newFile);
                }
            } else {
                System.out.format("文件【%s】中未找到 Origin DateTime 信息  \n", file.getPath());
            }
        }
    }
}

/**
 * 提取拍摄日期
 * @param file
 * @return
 */
public static String getOriginDateTime(File file) {

    String originDateTime = null;
    try {
        Metadata metadata = ImageMetadataReader.readMetadata(file);

        for (Directory directory : metadata.getDirectories()) {
            for (Tag tag : directory.getTags()) {
                if ("Date/Time Original".equals(tag.getTagName())) {
//                        System.out.format("[%s] - %s = %s \n",
//                                directory.getName(), tag.getTagName(), tag.getDescription());
                    originDateTime = tag.getDescription();
                }
            }
            if (directory.hasErrors()) {
                for (String error : directory.getErrors()) {
                    System.err.format("ERROR: %s %s \n", error, file.getPath());
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return originDateTime;
}

Main方法测试:

public static void main(String[] args) throws ImageProcessingException, IOException {

    recursion(new File("图片目录"));
}

执行结果:

可以根据自己需求重写重命名方法。比如在拍摄日期相同时加上一个自增数。

以上就是Java 提取照片的EXIF信息批量重命名的详细内容,更多关于Java 提取EXIF信息重命名的资料请关注脚本之家其它相关文章!

相关文章

  • springboot如何接收复杂参数(同时接收JSON与文件)

    springboot如何接收复杂参数(同时接收JSON与文件)

    文章介绍了在Spring Boot中同时处理JSON和文件上传时使用`@RequestPart`注解的方法,`@RequestPart`可以接收多种格式的参数,包括JSON和文件,并且可以作为`multipart/form-data`格式中的key
    2025-02-02
  • Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • spring boot 结合jsp案例详解

    spring boot 结合jsp案例详解

    这篇文章主要介绍了spring boot 结合jsp案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java NIO框架Netty简单使用的示例

    Java NIO框架Netty简单使用的示例

    本篇文章主要介绍了Java NIO框架Netty简单使用的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用

    JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 JDBC ,那么下面来教教大家传统JDBC的使用
    2022-09-09
  • java基本教程之join方法详解 java多线程教程

    java基本教程之join方法详解 java多线程教程

    本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧
    2014-01-01
  • 一篇文章教你如何用多种迭代写法实现二叉树遍历

    一篇文章教你如何用多种迭代写法实现二叉树遍历

    这篇文章主要介绍了C语言实现二叉树遍历的迭代算法,包括二叉树的中序遍历、先序遍历及后序遍历等,是非常经典的算法,需要的朋友可以参考下
    2021-08-08
  • Java switch使用原理及实例解析

    Java switch使用原理及实例解析

    这篇文章主要介绍了Java switch使用及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • IDEA 每次新建工程都要重新配置 Maven的解决方案

    IDEA 每次新建工程都要重新配置 Maven的解决方案

    这篇文章主要介绍了IDEA 每次新建工程都要重新配置Maven解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 详解如何在Elasticsearch中搜索空值

    详解如何在Elasticsearch中搜索空值

    这篇文章主要为大家介绍了如何在Elasticsearch中搜索空值的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论