欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

手機(jī)或照機(jī)拍攝的照片名稱(chēng)通常是”IMG_001.JPG”這種格式,這種文件名稱(chēng)是無(wú)意義的。使用照片拍攝時(shí)間命名可以讓我們?cè)诙嗄暌院蟛檎艺掌瑫r(shí)根據(jù)文件名就能快速篩選出某一時(shí)間段的照片。

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

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

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

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

但是存在幾個(gè)問(wèn)題:

  • 不能排除已丟失EXIF的文件,這類(lèi)的文件無(wú)法重命名
  • 官方ADSee免費(fèi)版下載安裝后,要注冊(cè)賬號(hào)才能使用

于是動(dòng)動(dòng)手,用JAVA代碼實(shí)現(xiàn)這個(gè)小功能。

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

metadata extractor 官網(wǎng):https://drewnoakes.com/code/exif/

引入依賴(lài):

<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方法測(cè)試:

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

    recursion(new File("圖片目錄"));
}

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

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

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

相關(guān)文章

  • mybatis多個(gè)接口參數(shù)的注解使用方式(@Param)

    mybatis多個(gè)接口參數(shù)的注解使用方式(@Param)

    這篇文章主要介紹了mybatis多個(gè)接口參數(shù)的注解使用方式(@Param),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法

    crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法

    crawler4j對(duì)response沒(méi)有指定編碼的頁(yè)面,解析成亂碼,很讓人煩惱,下面給出解決方法,需要的朋友可以參考下
    2014-04-04
  • 解決mybatis case when 報(bào)錯(cuò)的問(wèn)題

    解決mybatis case when 報(bào)錯(cuò)的問(wèn)題

    這篇文章主要介紹了解決mybatis case when 報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java之如何關(guān)閉流

    Java之如何關(guān)閉流

    這篇文章主要介紹了Java之如何關(guān)閉流問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決SpringMVC、tomcat、Intellij idea、ajax中文亂碼問(wèn)題

    解決SpringMVC、tomcat、Intellij idea、ajax中文亂碼問(wèn)題

    這篇文章主要介紹了解決SpringMVC、tomcat、Intellij idea、ajax中文亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • java多線程模擬搶紅包功能

    java多線程模擬搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了java多線程模擬搶紅包功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    這篇文章主要介紹了java static塊和構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握J(rèn)ava static關(guān)鍵字的函數(shù)方法,需要的朋友可以參考下
    2017-09-09
  • java開(kāi)發(fā)時(shí)各類(lèi)工具的使用規(guī)范

    java開(kāi)發(fā)時(shí)各類(lèi)工具的使用規(guī)范

    這篇文章主要介紹了java編碼時(shí)各類(lèi)工具的使用規(guī)范,多人協(xié)作、共同開(kāi)發(fā)一個(gè)項(xiàng)目,如果沒(méi)有統(tǒng)一的代碼規(guī)范的話,項(xiàng)目中的每個(gè)人都按照自己的習(xí)慣率性而為,就會(huì)導(dǎo)致整個(gè)項(xiàng)目的代碼看上去雜亂無(wú)章,可讀性非常差,并且持續(xù)增加后續(xù)的維護(hù)成本。對(duì)此感興趣可以來(lái)了解一下
    2020-07-07
  • mybatis 解決從列名到屬性名的自動(dòng)映射失敗問(wèn)題

    mybatis 解決從列名到屬性名的自動(dòng)映射失敗問(wèn)題

    這篇文章主要介紹了mybatis 解決從列名到屬性名的自動(dòng)映射失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java GUI進(jìn)階之流式布局管理器FlowLayout專(zhuān)項(xiàng)精講

    Java GUI進(jìn)階之流式布局管理器FlowLayout專(zhuān)項(xiàng)精講

    FlowLayout-流式布局管理器,按水平方向依次排列放置組件,排滿(mǎn)一行,換下一行繼續(xù)排列。排列方向(左到右 或 右到左)取決于容器的componentOrientation屬性
    2022-04-04

最新評(píng)論