写真(jpeg)からExifデータは抜き出すにはexif_read_data関数を使います。
$exifData = exif_read_data('img/test4.jpg');
サンプル
写真からExifデータを取得します。
そしてExifデータから更新日や緯度経度を抽出します。
緯度経度はGoogle Mapにも表示します。
Exifデータを保持している写真
array(56) {
["FileName"]=>
string(9) "test4.jpg"
["FileDateTime"]=>
int(1609739679)
["FileSize"]=>
int(100405)
["FileType"]=>
int(2)
["MimeType"]=>
string(10) "image/jpeg"
["SectionsFound"]=>
string(44) "ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS, INTEROP"
["COMPUTED"]=>
array(8) {
["html"]=>
string(24) "width="640" height="480""
["Height"]=>
int(480)
["Width"]=>
int(640)
["IsColor"]=>
int(1)
["ByteOrderMotorola"]=>
int(1)
["ApertureFNumber"]=>
string(5) "f/2.4"
["Thumbnail.FileType"]=>
int(2)
["Thumbnail.MimeType"]=>
string(10) "image/jpeg"
}
["Make"]=>
string(4) "Sony"
["Model"]=>
string(6) "SO-01E"
["Orientation"]=>
int(1)
["XResolution"]=>
string(4) "72/1"
["YResolution"]=>
string(4) "72/1"
["ResolutionUnit"]=>
int(2)
["Software"]=>
string(19) "9.1.C.1.186_58_f100"
["DateTime"]=>
string(19) "2015:08:09 19:05:05"
["YCbCrPositioning"]=>
int(1)
["Exif_IFD_Pointer"]=>
int(216)
["GPS_IFD_Pointer"]=>
int(628)
["THUMBNAIL"]=>
array(7) {
["Compression"]=>
int(6)
["Orientation"]=>
int(1)
["XResolution"]=>
string(4) "72/1"
["YResolution"]=>
string(4) "72/1"
["ResolutionUnit"]=>
int(2)
["JPEGInterchangeFormat"]=>
int(972)
["JPEGInterchangeFormatLength"]=>
int(6938)
}
["ExposureTime"]=>
string(6) "10/640"
["FNumber"]=>
string(5) "24/10"
["ISOSpeedRatings"]=>
int(80)
["ExifVersion"]=>
string(4) "0220"
["DateTimeOriginal"]=>
string(19) "2015:08:09 19:05:05"
["DateTimeDigitized"]=>
string(19) "2015:08:09 19:05:05"
["ComponentsConfiguration"]=>
string(4) " "
["ShutterSpeedValue"]=>
string(7) "600/100"
["ExposureBiasValue"]=>
string(3) "0/3"
["MeteringMode"]=>
int(2)
["LightSource"]=>
int(0)
["Flash"]=>
int(24)
["FocalLength"]=>
string(7) "448/100"
["FlashPixVersion"]=>
string(4) "0100"
["ColorSpace"]=>
int(1)
["ExifImageWidth"]=>
int(640)
["ExifImageLength"]=>
int(480)
["InteroperabilityOffset"]=>
int(598)
["CustomRendered"]=>
int(0)
["ExposureMode"]=>
int(0)
["WhiteBalance"]=>
int(0)
["DigitalZoomRatio"]=>
string(7) "214/100"
["SceneCaptureType"]=>
int(0)
["SubjectDistanceRange"]=>
int(0)
["GPSVersion"]=>
string(4) " "
["GPSLatitudeRef"]=>
string(1) "N"
["GPSLatitude"]=>
array(3) {
[0]=>
string(4) "26/1"
[1]=>
string(4) "40/1"
[2]=>
string(10) "32730/1000"
}
["GPSLongitudeRef"]=>
string(1) "E"
["GPSLongitude"]=>
array(3) {
[0]=>
string(5) "127/1"
[1]=>
string(4) "53/1"
[2]=>
string(9) "8506/1000"
}
["GPSAltitudeRef"]=>
string(1) ""
["GPSAltitude"]=>
string(9) "5000/1000"
["GPSTimeStamp"]=>
array(3) {
[0]=>
string(4) "10/1"
[1]=>
string(3) "5/1"
[2]=>
string(9) "2000/1000"
}
["GPSStatus"]=>
string(1) "A"
["GPSMapDatum"]=>
string(6) "WGS-84"
["GPSDateStamp"]=>
string(10) "2015:08:09"
["InterOperabilityIndex"]=>
string(3) "R98"
["InterOperabilityVersion"]=>
string(4) "0100"
}
Exifデータから抽出したプロパティの例
プロパティ |
値 |
更新日 |
2015-08-09 19:05:05 |
緯度 |
26.675758333333 |
経度 |
127.88569611111 |
Exifデータから抽出した緯度経度をGoogle Mapに表示する
<?php
$exifData = exif_read_data('img/test4.jpg');
// Exifデータから日付を抽出する。
$date1 = extrDateTimeFromExif($exifData);
$data['date1'] = $date1;
// Exifデータから緯度経度を取得する
$latlon = extrLatLonFromExif($exifData);
$data['lat'] = $latlon['lat'];
$data['lon'] = $latlon['lon'];
// Exifデータから日付を抽出する。
function extrDateTimeFromExif($exifData,$format='Y-m-d H:i:s'){
$date1 = null;
$keys = array(
'DateTimeOriginal',
'DateTimeDigitized',
'DateTime',
);
foreach($keys as $k){
if(!empty($exifData[$k])){
$date1 = $exifData[$k];
break;
}
}
if($date1 != null){
$date1 = date($format, strtotime($date1));
}
return $date1;
}
function extrLatLonFromExif($exifData){
$keys = array(
'lat'=>'GPSLatitude',
'lon'=>'GPSLongitude',
);
$res = array();
foreach($keys as $a => $key){
$p=null;
if(!empty($exifData[$key])){
$p = $exifData[$key];
if(is_array($p)){
// 分数表記を浮動小数点式に変換する
foreach($p as $i=>$v){
$p[$i] = fracToFloat($v);
}
}
// 度分秒表記を10進数表記に変換
$p = latlon60to10($p);
}
$res[$a] = $p;
}
return $res;
}
/**
* 分数表記を浮動小数点式に変換する
* @param string $str 分数表記の文字列 (例: 314/100)
* @return number 浮動小数値
*/
function fracToFloat($str){
// 「/」が文字列中に存在しなかったり、空であったりするなら、引数を返して処理を抜ける
if(!preg_match("/¥//", $str) || empty($str)){
return $str;
}
// 「/」で分割して配列を作り、チェックと数値加工を施す。
$ary=explode("/",$str);
foreach($ary as $i => $v){
$v = floatval ($v);
if(is_numeric($v)){
$ary[$i] = $v;
}else{
return $str;
}
}
// 分母が0でないなら除算をする。
if($ary[1]==0){
return $str;
}
$v = $ary[0] / $ary[1];
return $v;
}
/**
* 緯度経度を度分秒表記(60進数)から10進数に変換
* @param string or array $p 60進数緯度経度
* - 例
* - 26,40,32.73
* - 26度40分32.73秒
* - 26°40’32.73”
* - 26,40'32.73"
* - N26,40'32.73"
* - array(26,40,32.73)
* @return 10進数緯度経度
*/
function latlon60to10($p){
$res = null;
if(is_array($p)){
$ary = $p;
}else{
if(!is_numeric(mb_substr($p ,0 ,1))){
$p = mb_substr($p ,1 );
}
$ary = preg_split("/,|度|分|秒|°|’|”|'|\"/",$p);
if(count($ary) < 3){
return null;
}
}
$res = $ary[0] + $ary[1]/60 + $ary[2]/3600;
return $res;
}
?>
- ホーム
- サンプルソースコード
- PHP | サンプル
- Exifを取得