最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年04月23日 09:47:59   作者:攻城獅·正  
這篇文章主要介紹了Java 提取照片的EXIF信息批量重命名的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

手機(jī)或照機(jī)拍攝的照片名稱通常是”IMG_001.JPG”這種格式,這種文件名稱是無意義的。使用照片拍攝時間命名可以讓我們在多年以后查找照片時根據(jù)文件名就能快速篩選出某一時間段的照片。

原始照片或視頻是帶有EXIF信息的。這些信息是設(shè)備在拍攝時生成,記錄了照片的拍攝時間,設(shè)備信息,拍攝GPS位置等信息,在文件屬性中可以查看到:

圖片APP和網(wǎng)盤軟件中圖片時間線也是提取EXIF信息生成的。如果對照片進(jìn)行處理,如美化操作,另存為時可能會丟失EXIF信息,或者EXIF信息被改寫,會導(dǎo)致識別信息不準(zhǔn)。

我以前備份的照片,大多是原始文件名,現(xiàn)在我想根據(jù)拍攝日期批量重命名。

找了一圈,發(fā)現(xiàn)老牌看圖軟件ADSee帶有這個功能:

但是存在幾個問題:

  • 不能排除已丟失EXIF的文件,這類的文件無法重命名
  • 官方ADSee免費版下載安裝后,要注冊賬號才能使用

于是動動手,用JAVA代碼實現(xiàn)這個小功能。

提取EXIF信息使用的是開源項目 metadata extractor ,它支持市面上常見的媒體文件格式和設(shè)備:

metadata extractor 官網(wǎng):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);
        }
    }
}

以下是我使用示例代碼讀取一張圖片輸出的部分結(jié)果:

其中 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("圖片目錄"));
}

執(zhí)行結(jié)果:

可以根據(jù)自己需求重寫重命名方法。比如在拍攝日期相同時加上一個自增數(shù)。

以上就是Java 提取照片的EXIF信息批量重命名的詳細(xì)內(nèi)容,更多關(guān)于Java 提取EXIF信息重命名的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot如何接收復(fù)雜參數(shù)(同時接收J(rèn)SON與文件)

    springboot如何接收復(fù)雜參數(shù)(同時接收J(rèn)SON與文件)

    文章介紹了在Spring Boot中同時處理JSON和文件上傳時使用`@RequestPart`注解的方法,`@RequestPart`可以接收多種格式的參數(shù),包括JSON和文件,并且可以作為`multipart/form-data`格式中的key
    2025-02-02
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • spring boot 結(jié)合jsp案例詳解

    spring boot 結(jié)合jsp案例詳解

    這篇文章主要介紹了spring boot 結(jié)合jsp案例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java NIO框架Netty簡單使用的示例

    Java NIO框架Netty簡單使用的示例

    本篇文章主要介紹了Java NIO框架Netty簡單使用的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 一文帶你學(xué)會Spring?JDBC的使用

    一文帶你學(xué)會Spring?JDBC的使用

    JDBC?就是?數(shù)據(jù)庫開發(fā)?操作的?代名詞,因為只要是現(xiàn)代商業(yè)項目的開發(fā)那么一定是離不開?數(shù)據(jù)庫?的,不管你搞的是什么,只要是想使用動態(tài)的開發(fā)結(jié)構(gòu),那么一定就是?JDBC?,那么下面來教教大家傳統(tǒng)JDBC的使用
    2022-09-09
  • java基本教程之join方法詳解 java多線程教程

    java基本教程之join方法詳解 java多線程教程

    本文對java Thread中join()方法進(jìn)行介紹,join()的作用是讓“主線程”等待“子線程”結(jié)束之后才能繼續(xù)運行,大家參考使用吧
    2014-01-01
  • 一篇文章教你如何用多種迭代寫法實現(xiàn)二叉樹遍歷

    一篇文章教你如何用多種迭代寫法實現(xiàn)二叉樹遍歷

    這篇文章主要介紹了C語言實現(xiàn)二叉樹遍歷的迭代算法,包括二叉樹的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下
    2021-08-08
  • Java switch使用原理及實例解析

    Java switch使用原理及實例解析

    這篇文章主要介紹了Java switch使用及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • IDEA 每次新建工程都要重新配置 Maven的解決方案

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

    這篇文章主要介紹了IDEA 每次新建工程都要重新配置Maven解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 詳解如何在Elasticsearch中搜索空值

    詳解如何在Elasticsearch中搜索空值

    這篇文章主要為大家介紹了如何在Elasticsearch中搜索空值的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論

古蔺县| 年辖:市辖区| 武夷山市| 朔州市| 东乌珠穆沁旗| 葫芦岛市| 辉县市| 托克托县| 阿城市| 吉首市| 兴仁县| 贡觉县| 常州市| 淳化县| 山阳县| 贵定县| 凌源市| 扬中市| 昭苏县| 衡水市| 东光县| 雷波县| 济阳县| 共和县| 余庆县| 英山县| 沭阳县| 神木县| 乐安县| 青州市| 正宁县| 阿拉善盟| 巴青县| 花莲市| 五寨县| 曲阜市| 尖扎县| 饶阳县| 潞城市| 永州市| 邵武市|