1. 程式人生 > >讀取照片的Exif資訊

讀取照片的Exif資訊

下面兩篇文章介紹Exif

下面是第一篇

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

一、獲取圖片資訊

  imageIO框架是iOS中偏底層一點兒的框架,它內部提供的介面都是C風格的,關鍵資料也都是使用CoreFoundation進行儲存。慶幸的是CoreFoundation中有很多資料型別都可以上層的資料Foundation框架中的資料型別進行無縫橋接。這也就大大方便了我們對圖片資訊的操作。

  CGImageSourceRef是整個imageIO的入口,通過它我們可以完成從檔案的載入圖片。載入完成以後我們就得到一個CGImageSourceRef,通過CGImageSourceRef我們就可以獲取圖片檔案的大小,UTI(uniform type identifier),內部包含幾張圖片,訪問每一張圖片以及獲取每張圖片對應的exif資訊等。

  你可能會有一個疑問,為什麼會有幾張圖片呢?

  這塊兒我解釋一下,imageSourceRef和檔案是一一對應的,通常我們見到的圖片檔案(例如jpg,png)內部都只有一張圖片,這種情況我們通過CGImageSourceGetCount方法得到的就會是1。但是不能排除一個圖片檔案中會有多種圖片的情況,例如gif檔案,這個時候一個檔案中就可能包含幾張甚至幾十張圖片。前面我寫的一片部落格《

IOS中如何解析並顯示Gif》就是通過imageSource實現載入和解析gif的功能。

  下面是系統相機拍的照片的exif資訊:

 Exif info

  從中我們可以看出最開始的幾項分別顯示了當前圖片的顏色模式,色深,x,y方向的DPI,實際畫素以及圖片的方向。我最開始看到這個方向時,心中一喜這不是UIImage中的imageOrientation,但是實驗發現這個方向和UIImage中的imageOrientation並不相等,此處的方向是exif標準定義的方向,從1到8分別對應這UIImage中的8個方向,只是順序不一樣,它們對應關係如下:

複製程式碼
enum {
    exifOrientationUp 
= 1, // UIImageOrientationUp exifOrientationDown = 3, // UIImageOrientationDown exifOrientationLeft = 6, // UIImageOrientationLeft exifOrientationRight = 8, // UIImageOrientationRight // these four exifOrientation does not support by all camera, but IOS support these orientation exifOrientationUpMirrored = 2, // UIImageOrientationUpMirrored exifOrientationDownMirrored = 4, // UIImageOrientationDownMirrored exifOrientationLeftMirrored = 5, // UIImageOrientationLeftMirrored exifOrientationRightMirrored = 7, // UIImageOrientationRightMirrored }; typedef NSInteger ExifOrientation;
複製程式碼

  目前市面上的大部分數碼相機和手機都會內建一個方向感應器,拍出的照片中會寫如方向資訊,但是通常都只會有前四種方向。這幾種Mirrored方向通常都是手機前置攝像頭自拍的時候才會設定。

  exif為什麼要搞這麼一個方向呢?

  幾乎所有的攝像頭在出場的時候成相晶片都是有方向的,拍出來的照片的畫素都是預設方向的。如果每拍一張照片就對這些畫素進行旋轉,如果數碼相機每秒連拍20張來算,旋轉操作將會非常耗時。更聰明的做法是拍照時只記錄一個方向,然後顯示的時候按方向顯示出來即可。因此exif定義了一個標準的方向引數,只要讀圖的軟體都來遵守規則,載入時候讀取圖片方向,然後做相應的旋轉即可。這樣既可以達到快速成像的目的,又能達到正確的顯示,何樂而不為呢。

  常見的圖片瀏覽和編輯軟體都遵守這個規則,但是有一個我們最常用的看圖軟體(windows自帶的看圖程式)不會去讀這個方向,因此我們將數碼相機和手機拍出來的圖片匯入windows上時,會經常遇到方向錯誤的問題。不知道windows帝國是怎麼想的,或許和定義exif的組織有什麼過節吧。

  圖片資訊中除了上面看提到的那些,還有拍攝的GPS資訊,iOS自帶的相簿軟體中的地點tab就是按照GPS資訊實現的。還有很多其他的資訊,感興趣的可以自己寫個程式研究研究,這裡就不展開了。

二、修改圖片exif資訊

  我們除了可以通過CGImageSourceRef讀取圖片資訊,還可以通過CGImageDestinationRef來建立圖片檔案,在建立的時候我們可以指定很多資訊。例如我們可以通過CGImageDestinationRef來修改現有圖片的GPS資訊,圖片方向,甚至還可以自己寫一個製作gif的小工具。

  這塊兒我做了個實驗,通過修改圖片資訊的方向,來完成旋轉圖片的功能。原圖方向為1(exif方向),我修改為3。儲存後發現圖片的確翻轉過來了。於是更進一步想著試一下看看能不能完成90°旋轉的功能,於是把圖片方向改為6,儲存後發現通過UIImage載入的圖片顯示出現問題了,雖然方向是轉過來了,但是顯示卻被拉伸了。但是把儲存後的圖片存到系統相簿,發現一切正常。

相關推薦

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

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

android 拍照的照片方向問題,讀取圖片EXIF資訊

      Exif 是一種圖象檔案格式,它的資料儲存與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等

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

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

Java獲取照片EXIF資訊

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

iOS獲取照片EXif資訊

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

讀取照片Exif資訊

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

使用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

ELA演算法用於保險欺詐-偽造照片檢測及EXIF資訊顯示

用ELA演算法檢測JPG圖片是否有修改,並顯示可能修改的區域;並且可以檢視JPG圖片除縮圖相關的所有的EXIF資訊。 此工具可以檢測照片是否有過人工修改,可以根據EXIF中的資訊(照片拍攝的時間、GPS地點、拍攝工具、EXIF資訊是否完整)判斷照片是否PS過。使用的場景為: 1.驗車照片檢測;

常見的load_file()讀取的敏感資訊

轉自慕課大巴     1、 replace(load_file(0×2F6574632F706173737764),0×3c,0×20)2、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60

matlab批量讀取照片

相信這個問題應該是每一個剛剛接觸影象處理的小夥伴們在一開始最需要掌握的技能,否則一張一張的讀取圖片費時費力,並且遇到大型的專案工程,成百上千張圖片一張一張進行讀取也是非常不可行的。所以這裡也為我自己總結一下這個方法,以便以後自己查閱。   第一步:路徑賦值,使用 ' ' &nb

怎麼利用PHP讀取Excel檔案資訊及內容

  PHPExcel是什麼?PHPExcel 就是一個用來操作Office Excel 文件的PHP類庫。在程式設計技術開發中,我們經常要從程式中讀取Excel檔案內容,不過很多初學者都不太會,那麼下面來詳細為大家分析解答一下吧。比如說一個普通的個人資訊表,我們利用PHPExcel類庫將Excel表格內的資訊

wdmWin10下讀取PCI配置資訊

WDM下HalGetBusData不能用了。加上感覺png方式太麻煩。自己修改了驅動開發技術詳解上的程式碼直接在驅動下獲取資訊 #include "Driver.h" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNI

Asp.net Core 和類庫讀取配置檔案資訊

Asp.net Core 和類庫讀取配置檔案資訊 看乾貨請移步至.net core 讀取配置檔案公共類 首先開一個腦洞,Asp.net core 被使用這麼長時間了,但是關於配置檔案(json)的讀取,微軟官方似乎並沒有給出像.net framework讀取web.config那樣簡單且完美。嚴重懷

Spring的Java配置方式、讀取配置檔案資訊

Spring的發展 Spring1.x 時代 在Spring1.x時代,都是通過xml檔案配置bean,隨著專案的不斷擴大,需要將xml配置分放到不同的配置檔案中,需要頻繁的在java類和xml配置檔案中切換。 Spring2.

通過DMIDECODE讀取裝置硬體資訊並輸出檔案

一、dmidecode簡介       dmidecode允許你在Linux系統下獲取有關硬體方面的資訊。dmidecode遵循SMBIOS/DMI標準,其輸出的資訊包括BIOS、系統、主機板、處理器、記憶體、快取等等。       DMI(Desktop Managem

U3D儲存物體位置資訊讀取物體位置資訊

using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO.Ports; using System.Threading; using System

利用python讀取照片拍攝時間來重新命名照片,方便組織和查詢

使用iphone手機拍照後的照片名字是“IMG_數字.jpg”的命名規則,使用下面的指令碼可以將影象重新命名為“拍攝年月日_IMG_數字.jpg”的形式。 import os import exifread def getExif(path, filename):

勻光勻色軟體升級版(多執行緒+EXIF資訊

原版介紹 新增功能: 1、處理過程中無損保留EXIF資訊。(如GPS座標等) 2、提供多執行緒並行處理,可以手動選擇程序數。 3、額外提供EXIF修復功能,從原圖中拷貝。

shell 讀取描述檔案資訊

# 獲取描述檔案資訊 mobileprovision_file=/Users/1/Desktop/1.mobileprovision mobileprovision_teamname=`/usr/libexec/PlistBuddy -c "Print TeamName" /dev/stdin

[Python] 檢查照片 exif 進行自動轉向

_orientation_to_rotation = { 3: 180, 6: 90, 8: 270 } deg = 0 if self._orig_format == "JPEG": try: exif = self.img._get