1. 程式人生 > >照片EXIF資訊的讀取和改寫的JAVA實現

照片EXIF資訊的讀取和改寫的JAVA實現

由於專案需要對照片的EXIF資訊進行處理,因此在網上搜索了一番。搗鼓出來了,寫下,總結。

需要用到2個jar包,metadata-extractor-2.3.1和mediautil-1.0。這2個jar包比較好找,地址就不寫了,搜尋下就OK。需要注意的是,mediautil-1.0這個jar包你需要修改下。因為,專案需要修改GPS,其提供的例子後面還提供了個地址,裡面有5個java檔案,拿出來,在專案中建好。然後在jar包將裡面5個同名的檔案刪除,就OK了。否則你的例子會報錯,還有,專案的JDK必須是1.5,編譯環境也必須是1.5哦。這2個jar包,前者只能讀,不能寫,後者呢可以讀也可以寫,但是使用沒有前者方便,因此仍然保留。

下面就帖2段程式碼,只貼main方法了。

先是讀取EXIF資訊的。

<span style="font-size:14px;">public static void main(String[] args) throws Exception {
         File jpegFile = new File("D://nozip//4.jpg");
         Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
         Directory exif = metadata.getDirectory(ExifDirectory.class);//這裡要稍微注意下
         Iterator tags = exif.getTagIterator();
         while (tags.hasNext()) {
             Tag tag = (Tag)tags.next();
             System.out.println(tag);
         }
    }

</span>

上面寫的稍微注意的地方是要注意ExifDirectory.class,因為ExifDirectory只是EXIF中大部分的引數,但是並不是所有的引數。比如要檢視GPS的資訊則需要GpsDirectory,而它和ExifDirectory都是繼承自Directory。同樣繼承自Directory還有好幾個,就看你需要的情況了。順便貼下它的API

再下面是寫EXIF資訊的。

<span style="font-size:14px;">       /**
         * 將照片中的資訊進行重寫
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {

            //原檔案
            InputStream fip = new BufferedInputStream(new FileInputStream("D://nozip//2.jpg")); // No need to buffer
            LLJTran llj = new LLJTran(fip);
            try {
                llj.read(LLJTran.READ_INFO, true);
            } catch (LLJTranException e) {
                e.printStackTrace();
            }

            Exif exif = (Exif) llj.getImageInfo();      
            
            /* Set some values directly to gps IFD */
                    
            Entry e;

            // Set Latitude
            e = new Entry(Exif.ASCII);        
            e.setValue(0, 'N');
            exif.setTagValue(Exif.GPSLatitudeRef,-1, e, true);

            //設定具體的精度
             e = new Entry(Exif.RATIONAL);
            e.setValue(0, new Rational(31, 1));
            e.setValue(1, new Rational(21, 1));
            e.setValue(2, new Rational(323, 1));
            exif.setTagValue(Exif.GPSLatitude,-1, e, true);
            
            // Set Longitude
            e = new Entry(Exif.ASCII);
            e.setValue(0, 'E');
            exif.setTagValue(Exif.GPSLongitudeRef,-1, e, true);
            
            //設定具體的緯度
             e = new Entry(Exif.RATIONAL);
            e.setValue(0, new Rational(120, 1));
            e.setValue(1, new Rational(58, 1));
            e.setValue(2, new Rational(531, 1));
            exif.setTagValue(Exif.GPSLongitude,-1, e, true);
            
            llj.refreshAppx(); // Recreate Marker Data for changes done

            //改寫後的檔案,檔案必須存在
             OutputStream out = new BufferedOutputStream(new FileOutputStream("D://nozip//1.jpg"));

            // Transfer remaining of image to output with new header.
            llj.xferInfo(null, out, LLJTran.REPLACE, LLJTran.REPLACE);

            fip.close();
            out.close();

            llj.freeMemory();
        }

</span>

將圖片中的GPS資訊進行重寫後,再用上面讀GPS的來讀將讀取不到任何資訊,只能在ExifDirectoy裡面才能讀到了,但是都是unkown tag了,很是奇怪。但是,機器等裝置還是可以讀到資訊的。

from: http://www.aiuxian.com/article/p-2976272.html

關注公眾號,分享乾貨,討論技術


相關推薦

照片EXIF資訊讀取改寫JAVA實現

由於專案需要對照片的EXIF資訊進行處理,因此在網上搜索了一番。搗鼓出來了,寫下,總結。需要用到2個jar包,metadata-extractor-2.3.1和mediautil-1.0。這2個jar包比較好找,地址就不寫了,搜尋下就OK。需要注意的是,mediautil-1

Java獲取照片EXIF資訊

今天上傳幾張照片到人人相簿,發現可以看到我相機的資訊,當然很多圖片軟體都能看到,所以搜尋了下Java如何操作,以後備用。 首先介紹一下什麼是EXIF,EXIF是 Exchangeable Image File的縮寫,這是一種專門為數碼相機照片設定的格式。這種格式可

數據庫並行讀取寫入(Python實現)

ews for rom join() rgs one val connect ssi max_process = 16 #最大進程數 def read_SQL_write(r_host,r_port,r_user,r_passwd,r_db,r_charset,w_host

Android通過Bluetooth藍芽傳送手機照片檔案到Windows PC:Java實現

Android通過Bluetooth藍芽傳送手機照片檔案到Windows PC:Java實現 本文在《Android通過藍芽傳送資料到Windows PC電腦:Java實現(連結地址:https://blog.csdn.net/zhangphil/article/details/831467

Delete Node in a BST 二叉查詢樹的查詢、插入刪除 - Java實現

https://leetcode.com/problems/delete-node-in-a-bst Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return t

hadoop 二次排序一個java實現

需要二次排序的原因:mapreduce架構自動對對映器生成的鍵進行排序,即歸約器啟動之前,所有鍵是有序的,但是值是隨機的,二次排序指的是對值進行排序。歸約器輸入形如:,即一個key對應多個值,這些值是無序的,排序後得到有序的值,如下: 其中,S按照升序或者降序排列

spring自動裝配通過java實現裝配

ati 三方庫 autowired 模式 限定 程序 str primary java實現 1.組建掃描 在類上添加註解@Component註解可以實現組建掃描 @Component public class A{ ... } 2.自動裝配 通過在屬性上或者方

給定一個數組,求出陣列元素的排列組合——Java實現

1. 思路 組合數C(n,m)和全排列A(n,n)可以通過遞迴的方式,直接實現。 而A(n,m)則可以通過組合數和全排列間接求出A(n,m)=C(n,m)*A(m,m),即對得到的組合數中的每個元素進行全排列 2. Java實現 package com.zfy.test

求最大子序列Java實現

【問題描述】最大子序列和問題:給定整數A1, A2, ..., An(可能有負數),ΣAk的最大值(為方便起見,如果所有整數均為負數,則最大子序列和為0)。 通過四種方式來完成演算法的實現,時間複雜度分別為:O(N*N*N)、O(N*N)、O(N*log N)、O(N) 【

【夜半寫點啥】Hbuilder+exif.js獲取照片exif資訊

【概】我在H5端需要這麼一個功能::本地選擇圖片並獲取exif資訊(主要是建立時間、和地點等),翻了半天Hbuilder文件,沒發現這個api,於是目光轉焦到強大滴exif.js上。step1、引入檔案<script type="text/javascript" src

最大子序列Java實現

如果a[i]是負的,那麼它不可能代表最優序列的起點,因為任何包含a[i]作為起點的子序列都可以通過a[i+1]作起點而得到改進。任何負的子序列不可能是最優子序列的字首。時間複雜度O(N)的解法:

分組校驗java實現

分組校驗和的演算法用在了很多分組的計算中。現在只針對IP分組而言,IP分組只對IP分組頭進行計算,演算法如下: 1、計算校驗和 1)初始時,將校驗和域都設定為0 2)每16bit做二進位制反碼求和。 3)得到的結果取反便是檢驗和 2、驗證校驗和 1)

iOS獲取照片EXif資訊

方法一:知道照片URL //新建CGImageSourceRef物件 CGImageSourceRef*imageRef= CGImageSourceCreateWithURL((CFURLRef)imageUrl, NULL); //獲取照片資訊 NSDictiona

基於spring-bootdocker-java實現對docker容器的動態管理監控[附完整原始碼下載]

​ (我是個封面) docker簡介 Docker 是一個開源的應用容器引擎,和傳統的虛擬機器技術相比,Docker 容器效能開銷極低,因此也廣受開發者喜愛。隨著基於docker的開發者越來越多,docker的映象也原來越豐富,未來各種企業級的完整解決方案都可以直接通過下載映象拿來即用。因此do

java實現json檔案的讀取解析

<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId>

使用Java程式讀取JPG Tif等格式圖片的exif資訊

package com.util; import java.io.File;import java.util.Iterator; import com.drew.imaging.ImageProcessingException;import com.drew.metadata.Directory;impo

Java實現在文字檔案中寫入資料讀取資料

Java實現在文字檔案中寫入資料和讀取資料 寫資料到文字檔案中去: 程式碼如下所示: import java.io.File; import java.io.FileWriter; import java.io.IOException; public class

java nio 實現檔案的讀取輸出

1、讀取檔案流     File f= new File("**");     FileInputStream in=new FileInputStream(f);     //獲取輸入管道     FileChannel inChannel=in.getChannel()

java實現對MySql資料庫中資料的讀取、插入、修改刪除

目標: 1、實現eclipse同資料庫的連線 2、在eclipse中用java實現對資料庫的控制 初學java和資料庫,本文是參考這篇文章的思路的學習筆記,程式碼實現了將4個控制函式(讀取、插入、修改和刪除)分別寫成4個靜態方法呼叫。 1. 關於java和MySQL的連

讀取照片Exif資訊

下面兩篇文章介紹Exif 下面是第一篇 一幅圖片除了包含我們能看見的畫素資訊,背後還包含了拍攝時間,光圈大小,曝光等資訊。UIImage類將這些細節資訊都隱藏了起來,只提供我們關心的圖片尺寸,圖片方向等。我們可以通過imageIO框架獲取到圖片背後的所有資訊,下面就