图片Exif信息解析(Java实现)
生活随笔
收集整理的這篇文章主要介紹了
图片Exif信息解析(Java实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
可交換圖像文件(Exchangeable Image File,Exif)信息圖像在拍攝時保留的相關參數:比如圖像信息(廠商,分辨率等),相機拍攝記錄(ISO,白平衡,飽和度,銳度等),縮略圖(縮略圖寬度,高度等),GPS(拍攝時的經度,緯度,高度)等,按照圖像文件標準存儲在圖像頭文件。一般使用支持圖像讀取的軟件即可查看部分參數,但是圖像如果修改,Exif信息可能丟失。
? ?
問題
然而一些開發任務需要圖片Exif信息某項信息進行后續處理,無法使用軟件獲取信息輸入到程序中,對開發任務帶來一些困難。
解決
引入drewnoakes庫,該庫可以分析照片、視頻相關信息等強大功能。
有興趣可關注微信公眾號:Java爛筆頭,回復:drewnoakes,查看完整源碼及說明。
示例代碼
Maven依賴
<dependency><groupId>com.drewnoakes</groupId><artifactId>metadata-extractor</artifactId><version>2.7.2</version></dependency>代碼實現
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 java.io.File;public class ExifTest {public static void main(String[] args) throws Exception {File file = new File("D:\\Java學習\\二維碼生成與解析\\mmexport1632468955620.jpg");printImageTags(file);}/*** 讀取照片相關信息*/private static void printImageTags(File file) throws ImageProcessingException, Exception {Metadata metadata = ImageMetadataReader.readMetadata(file);String lat = "";String log = "";for (Directory directory : metadata.getDirectories()) {for (Tag tag : directory.getTags()) {String tagName = tag.getTagName(); //標簽名String desc = tag.getDescription(); //標簽信息System.out.println(tagName + " " + desc);//照片信息}}} }照片信息輸出
(由于不同照片所包含信息不完全一樣,部分相關信息沒有)
Compression Type Baseline Data Precision 8 bits Image Height 1080 pixels Image Width 1440 pixels Number of Components 3 Component 1 Y component: Quantization table 0, Sampling factors 2 horiz/2 vert Component 2 Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert Component 3 Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert Version 1.1 Resolution Units none X Resolution 1 dot Y Resolution 1 dot Profile Size 536 Version 2.1.0 Class Display Device Color space RGB Profile Connection Space XYZ Profile Date/Time Wed Dec 31 08:00:00 CST 2 Signature acsp Rendering Intent Media-Relative Colorimetric XYZ values 0.9642029 1.0 0.8249054 Tag Count 9 Profile Description 1 enUS(sRGB ) Red Colorant (0.43606567, 0.2224884, 0.013916016) Green Colorant (0.3851471, 0.71687317, 0.097076416) Blue Colorant (0.1430664, 0.06060791, 0.71409607) Red TRC para(0x70617261): 40 bytes Green TRC para(0x70617261): 40 bytes Blue TRC para(0x70617261): 40 bytes Media White Point (0.9642029, 1.0, 0.8249054) Copyright 1 enUS(Google Inc. 2016)
應用場景
需求:根據照片(包含位置信息)查找該照片拍攝定位
思路:首先引入drewnoakes庫讀取照片所有信息,判斷tag信息為經度、緯度,根據經緯度轉換為具體坐標位置。
工具代碼:
以下代碼還引入alibaba.fasejson庫對讀取的Exif信息進一步分析
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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 java.io.File; import java.net.URL;public class EXIFUtil {public static void main(String[] args) throws Exception {File file = new File("D:\\Java學習\\二維碼生成與解析\\mmexport1632468955620.jpg");printImageTags(file);}/*** 讀取照片里面的信息*/private static void printImageTags(File file) throws ImageProcessingException, Exception {Metadata metadata = ImageMetadataReader.readMetadata(file);String lat = "";String log = "";for (Directory directory : metadata.getDirectories()) {for (Tag tag : directory.getTags()) {String tagName = tag.getTagName(); //標簽名String desc = tag.getDescription(); //標簽信息System.out.println(tagName + " " + desc);//照片信息switch (tagName) {// 經度case "GPS Longitude":lat = pointToLatlong(desc);break;// 緯度case "GPS Latitude":log = pointToLatlong(desc);break;default:break;}}}String add = getAdd(log, lat);JSONObject jsonObject = JSON.parseObject(add);JSONArray jsonArray = jsonObject.getJSONArray("addrList");JSONObject jso = jsonArray.getJSONObject(0);String allAdd = jso.getString("admName");String arr[] = allAdd.split(",");String adds = jso.getString("name");System.out.println("省:" + arr[0] + "\n市:" + arr[1] + "\n區:" + arr[2] + "\n" + adds);}/*** 經緯度格式 轉換** @param point 坐標點** @return*/public static String pointToLatlong(String point) {Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim());Double fen = Double.parseDouble(point.substring(point.indexOf("°") + 1, point.indexOf("'")).trim());Double miao = Double.parseDouble(point.substring(point.indexOf("'") + 1, point.indexOf("\"")).trim());Double duStr = du + fen / 60 + miao / 60 / 60;return duStr.toString();}/*** @param log 經度** @param lat 緯度** @return*/public static String getAdd(String log, String lat) {//參數解釋: 緯度,經度 type 001 (100代表道路,010代表POI,001代表門址,111可以同時顯示前三項)String urlString = "http://gc.ditu.aliyun.com/regeocoding?l=" + lat + "," + log + "&type=010";String res = "";try {URL url = new URL(urlString);java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();conn.setDoOutput(true);conn.setRequestMethod("POST");java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {res += line + "\n";}in.close();} catch (Exception e) {System.out.println("error in wapaction,and e is " + e.getMessage());}return res;}}示例源碼以及應用源碼關注微信公眾號:Java爛筆頭,回復:EXIFUtil
總結
以上是生活随笔為你收集整理的图片Exif信息解析(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: h3cmsr830series说明书_H
- 下一篇: 月薪11970元的网络运维工程师需要掌握