1. 程式人生 > >Java圖片上傳與EXIF資訊採集

Java圖片上傳與EXIF資訊採集


Exif是一種圖象檔案格式,它的資料儲存與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、型號、色彩編碼、拍攝時錄製的聲音以及全球定位系統(GPS)、縮圖等。簡單地說,Exif=JPEG+拍攝引數。

——百度百科·Exif

實現圖片Exif資訊採集

最近專案中需要獲取到使用者上傳圖片的拍攝日期,想起可以使用metadata-extractor解析。這個jar包可以拿到關於圖片的很多資訊,程式碼如下:

/**
 * 圖片Exif資訊採集
 *
 */
public class ImageExif 
{
    public static void main( String[] args ) 
    		throws ImageProcessingException, IOException{
    	
        File img = new File("圖片.jpg");
        Metadata meta = JpegMetadataReader.readMetadata(img);
        
        for(Directory dir : meta.getDirectories()){
        	for(Tag tag : dir.getTags()){
        		String tagName = tag.getTagName();
        		String description = tag.getDescription();
        		System.out.printf("%-30s\t%-100s\n", tagName, description);
        	}
        }
    }
}

執行結果如下:

Compression Type              	Baseline
Data Precision                	8 bits
Image Height                  	800 pixels
Image Width                   	532 pixels
Number of Components          	3
Component 1                   	Y component: Quantization table 0, Sampling factors 1 horiz/1 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.2
Resolution Units              	inch
X Resolution                  	72 dots
Y Resolution                  	72 dots
Make                          	NIKON CORPORATION
Model                         	NIKON D700
Orientation                   	Top, left side (Horizontal / normal)
X Resolution                  	72 dots per inch
Y Resolution                  	72 dots per inch
Resolution Unit               	Inch
Software                      	Adobe Photoshop CS3 Windows
Date/Time                     	2010:04:19 10:59:46
Artist                        	MINGGO
Copyright                     	MINWT
Exposure Time                 	1/80 sec
F-Number                      	F5.6
Exposure Program              	Manual control
ISO Speed Ratings             	1600
Exif Version                  	2.21
Date/Time Original            	2010:04:18 11:59:49
Date/Time Digitized           	2010:04:18 11:59:49
Shutter Speed Value           	1/79 sec
Aperture Value                	F5.6
Exposure Bias Value           	0 EV
Max Aperture Value            	F1.7
Metering Mode                 	Spot
White Balance                 	Unknown
Flash                         	Flash did not fire
Focal Length                  	50.0 mm
Sub-Sec Time                  	56
Sub-Sec Time Original         	56
Sub-Sec Time Digitized        	56
Color Space                   	sRGB
Exif Image Width              	532 pixels
Exif Image Height             	800 pixels
Sensing Method                	One-chip color area sensor
File Source                   	Digital Still Camera (DSC)
Scene Type                    	Directly photographed image
CFA Pattern                   	2 0 2 0 0 1 1 2
Custom Rendered               	Normal process
Exposure Mode                 	Manual exposure
White Balance Mode            	Auto white balance
Digital Zoom Ratio            	1
Focal Length 35               	50mm
Scene Capture Type            	Portrait
Gain Control                  	Low gain down
Contrast                      	None
Saturation                    	None
Sharpness                     	Hard
Subject Distance Range        	Unknown
Thumbnail Compression         	JPEG (old-style)
X Resolution                  	72 dots per inch
Y Resolution                  	72 dots per inch
Resolution Unit               	Inch
Thumbnail Offset              	898 bytes
Thumbnail Length              	6474 bytes
Lens Information              	500/10 500/10 18/10 18/10
Lens                          	50.0 mm f/1.8
Serial Number                 	2270203
Make                          	NIKON CORPORATION
Model                         	NIKON D700
Exposure Time                 	1/80 sec
Exposure Program              	Manual control
Aperture Value                	F5.6
F-Number                      	F5.6
Focal Length                  	50.0 mm
Shutter Speed Value           	1/79 sec
Date/Time Original            	Sun Apr 18 11:59:49 CST 2010
Date/Time Digitized           	Sun Apr 18 11:59:49 CST 2010
Rating                        	0.0
Profile Size                  	3144
CMM Type                      	Lino
Version                       	2.1.0
Class                         	Display Device
Color space                   	RGB
Profile Connection Space      	XYZ
Profile Date/Time             	Mon Mar 09 14:49:00 CST 1998
Signature                     	acsp
Primary Platform              	Microsoft Corporation
Device manufacturer           	IEC
Device model                  	sRGB
XYZ values                    	0.9642029 1.0 0.8249054
Tag Count                     	17
Copyright                     	Copyright (c) 1998 Hewlett-Packard Company
Profile Description           	sRGB IEC61966-2.1
Media White Point             	(0.9504547, 1.0, 1.0890503)
Media Black Point             	(0.0, 0.0, 0.0)
Red Colorant                  	(0.43606567, 0.2224884, 0.013916016)
Green Colorant                	(0.3851471, 0.71687317, 0.097076416)
Blue Colorant                 	(0.1430664, 0.06060791, 0.71409607)
Device Mfg Description        	IEC http://www.iec.ch
Device Model Description      	IEC 61966-2.1 Default RGB colour space - sRGB
Viewing Conditions Description	Reference Viewing Condition in IEC61966-2.1
Viewing Conditions            	view(0x76696577): 36 bytes
Luminance                     	(76.03647, 80.0, 87.12462)
Measurement                   	1931 2° Observer, Backing (0.0, 0.0, 0.0), Geometry Unknown, Flare 1%, Illuminant D65
Technology                    	CRT
IPTC-NAA Record               	28 bytes binary data
Caption Digest                	-120 115 -64 -22 54 -33 38 23 120 -85 -32 -118 -89 -67 -86 116
Print Info                    	[74 bytes]
Resolution Info               	72.0x72.0 DPI
Print Scale                   	Centered, Scale 1.0
Global Angle                  	30
Global Altitude               	30
Print Flags                   	0 0 0 0 0 0 0 0 1
Copyright Flag                	No
Print Flags Information       	0 1 0 0 0 0 0 0 0 2
Color Halftoning Information  	[72 bytes]
Color Transfer Functions      	[112 bytes]
Grid and Guides Information   	0 0 0 1 0 0 2 64 0 0 2 64 0 0 0 0
URL List                      	0
Slices                        	DSC_3081 (0,0,800,532) 1 Slices
Pixel Aspect Ratio            	1.0
Seed Number                   	1
Thumbnail Data                	JpegRGB, 106x160, Decomp 51200 bytes, 1572865 bpp, 6474 bytes
Version Info                  	1 (Adobe Photoshop, Adobe Photoshop CS3) 1
JPEG Quality                  	12 (Maximum), Optimised format, 3 scans
Application Record Version    	97
By-line                       	MINGGO
Copyright Notice              	MINWT
DCT Encode Version            	1
Flags 0                       	64
Flags 1                       	0
Color Transform               	YCbCr

其中,Date/Time Original對應就是圖片拍攝的日期。

圖片上傳挖出的坑

這裡有一個坑,本來專案採用的是SpringMVC框架,在Controller中實現圖片上傳,然後解析圖片。但問題是,SpringMVC使用MultipartFile來接收前臺傳過來的檔案,這個類和File類不是繼承關係。雖然可以講MultipartFile類通過transferTo方法轉換為File類,但這個轉換過程會丟失Exif資訊。

為了解決這個問題,我放棄了SpringMVC的Controller,改用Servlet實現圖片上傳功能。

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload sfu = new ServletFileUpload(factory);
    sfu.setHeaderEncoding("UTF-8"); // 處理中文問題
    sfu.setSizeMax(1024 * 1024 * 5); // 限制檔案大小

    int success = 1;
    try {
        // 解碼請求
        List<FileItem> fileItems = sfu.parseRequest(request);
        // 得到所有表單元素
        for (FileItem fi : fileItems) {
            // 有可能是檔案,也可能是普通表單
            if (!fi.isFormField()) {
                String fileName = fi.getName();
                File file = new File("D:\\upload", fileName);
                fi.write(file);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        success = 0;
    }

    Map<String, Object> result = new HashMap<String, Object>();
    result.put("success", success);
    result.put("url", fileName);
    response.getWriter().write(JsonUtil.writeObj2JSON(result));
}

關於檔案上傳

檔案上傳是專案中經常會遇到的需求,檔案上傳的表單在前臺表現為type為file的input標籤。對於包裹這個input的form標籤,需要定義其method屬性為POST,另外需要指定enctype="multipart/form-data"。這二者缺其一,後臺都無法接收到上傳的檔案,如果使用的SpringMVC,同時使用MultipartFile接收檔案,甚至會報異常。

ajaxfileupload與坑爹的手機UC

ajaxfileupload.js能夠幫助我們完成圖片上傳的頁面工作,使用它我們就可以不用理會什麼method為POST、enctype屬性等問題,只需要在頁面放置一個file input即可。可以想見的是,ajaxfileupload的工作原理即為將指定的file input通過js指令碼封裝到一個form表單中,同時它會自動完成必備的條件,比如enctype屬性。

使用ajaxfileupload需要以下步驟:

  1. 引入jquery.min.js與ajaxfileupload.js檔案;

  2. 在html程式碼中放置一個file input,並指定id;

  3. 編寫檔案上傳程式碼及上傳完成後的回撥函式。

程式碼實現如下:

​<!doctype html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>AjaxFileUpload</title>
</head>
<body>
    <input type="file" name="file" id="file"/>
    <script src="js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/ajaxfileupload.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        $(function(){
            $('#file').on('change', function(){
                $.ajaxFileUpload({
                    url:'image_upload.do',
                    secureuri :false,
                    fileElementId :'file', // file input的id值
                    dataType:'text',
                    success : function (data, status){
                        data = data.replace(/^<pre.*>(.*)<\/pre>$/g, '$1');
                        alert('圖片上傳成功');
                    },
                    error: function(data, status, e){
                        alert('圖片上傳失敗');
                    }
                });
            });
        });
    </script>
</body>
</html>

需要注意的是,在success回撥函式中,返回的資料data,會被pre標籤包裹,所以在使用之前需要將pre標籤去掉。為什麼說手機UC瀏覽器坑爹呢,是因為即便去掉這個pre標籤,手機UC瀏覽器還是會在返回的data後追加一段script指令碼,所以最好判斷下,是否有script標籤程式碼,有的話也去掉。

相關推薦

Java圖片EXIF資訊採集

Exif是一種圖象檔案格式,它的資料儲存與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、型號、色彩編碼、拍攝時錄製的聲音以及全球定位系統(GPS

Java圖片

ack 連接 ati pat html out eclips ppi substring 最近閑來無事,就整理常用的功能,以下是項目中圖片上傳的功能,將圖片上傳到服務器tomcat下,數據庫中存放相對路徑,大家一起學習。環境:eclipse jdk1.7 tomcat7 m

圖片顯示時候的路徑問題

serve nbsp http src png In 分享 圖片 server 上傳時候的要求將圖片放到tomcat下面: 顯示的時候:server.xml 圖片上傳與顯示時候的路徑問題

SpringMVC框架五:圖片JSON交互

view 方便 for 發布項目 repo 必須 class ebo http 在正式圖片上傳之前,先處理一個細節問題: 每一次發布項目,Tomcat都會重新解壓war包,之前上傳過的圖片會丟失 為了解決這個問題:可以不在Tomcat下保存圖片,而是另找一個目錄。 上傳

struts2圖片下載

package com.zking.five.web; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInpu

java圖片-檔案/圖片到七牛

java圖片上傳-檔案(圖片)上傳到七牛 一、在配置檔案中引入依賴(注:七牛開發者url:https://developer.qiniu.com/kodo) <-- 引入依賴 --> <dependency> <

5行程式碼實現微信小程式圖片騰訊免費5G儲存空間的使用

本文介紹瞭如何在微信小程式開發中使用騰訊官方提供的雲開發功能快速實現圖片的上傳與儲存,以及介紹雲開發的 5G 儲存空間的基本使用方法,這將大大提高微信小程式的開發效率,同時也是微信小程式系列教程的視訊版更新的文字版本摘要。 此文為 「60 節實戰課微信小程式開發視訊教程」 的第 51 小節

阿里雲伺服器 雲物件儲存OOS(二) ---圖片讀取demo

上一篇講解了無需程式碼操作的阿里OOS雲物件儲存 http://blog.csdn.net/u014520797/article/details/53945912 1、SDK下載,不下載也可以,文章最後有demo,demo裡面有jar包 https://help.aliyun.com/d

Java圖片+回顯技術

前言 先說一下整體得流程,首先需求為給角色上傳頭像,通過新增頁面對使用者新增頭像並回顯,然後填寫資訊後進行表單提交,傳送ajaxfileupload請求給java,java處理相應請求後,將圖片上傳tomcat伺服器,最後將真實路徑存入資料庫,並在前臺JSP調取相對應得img真實路徑

java圖片七牛雲伺服器

七牛雲地址 七牛雲官網 註冊首頁 登入首頁 實名認證:上傳身份證資訊等 上傳圖片: 1.物件儲存 2.新建一個儲存空間 3.建好儲存空間後內容管理 4.預設外鏈(將於2018-08-22起改版,一個月有效期,可以在測試環境中使用)

SSM使用ajax實現圖片刪除功能

圖片上傳與刪除 1.上傳檔案 2.刪除資料,並且刪除對應的檔案 之前寫了一篇部落格記錄了關於修改資料中的圖片上傳 (傳送門),這次用到了直接上傳圖片的功能,對上一篇部落格進行了簡單的優化與改進。 改進問題: 之前刪除該資料時

Java檔案下載

  檔案上傳與下載可謂上網中的常見現象。apache為我們準備了用於檔案上傳與下載的兩個jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar)。我們在web專案中,將這兩個jar包新增依賴,就可以使用客戶端上傳檔案、伺服器端下載檔案的功能。

七牛雲JAVA圖片

七牛雲上傳簡單應用,java版 記得匯入七牛雲的SDK AccountMgr.java------儲存AK  and SK /** * 七牛雲AK 和SK * 賬戶資訊,獲取授權認證 */

springboot圖片回顯

一,檔案配置server: port: 8080 spring: servlet: multipart: max-file-size: 128MB max-request-size: 128MB二,前臺介面    2.1上傳介面:&l

成功實現Django Admin圖片縮圖處理

經過一天的努力,終於實現了完全用Django的方式上傳圖片,並且可自動生成縮圖。過程是很鬱悶的,因為網上搜索到的東西大都不完全。只是給點明一下。比較全面點的參考文章是http://imtx.me/archives/693.html。不過按照這上面說的,做完後會提示錯誤,如下

SSH 框架下圖片顯示

這幾天在弄畢設,有幾個需求是要上傳圖片的,看了很多教程,各有各的說法,關鍵點、細節很多說不明白,自己倒騰了幾天,弄出來了,給大家分享一下。上傳圖片的JSP<%@ page language="java" import="java.util.*" pageEncoding

用SpringMVC框架實現圖片下載

1、新建一個Maven webapp專案,引入需要用的夾包,pom.xml檔案的依賴包如下: <dependencies> <!-- 用於生成圖片的縮圖 --> <dependency> <g

Python3.5 Django1.9.3 圖片返回

Django框架對於靜態檔案的上傳和返回有良好的支援,下面分為圖片上傳和下載兩個部分來簡單記錄。 檔案上傳 安卓客戶端上傳: 點選上傳按鈕後會像伺服器傳送一個file,其中file是一個File型別的檔案。 User.getInstance().uplo

Java 檔案下載

日常開發中,時常遇到檔案的上傳與下載。這裡就檔案的上傳和下載功能做一個共通的Java類,方便以後呼叫! 1.首先是檔案的下載共通類: import java.io.File; import java.io.FileOutputStream;

Java 檔案下載、email

/**  * 處理檔案上傳與下載  * @author Jie.Yuan  *  */ public class FileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResp