使用 PHP exif_read_data获取照片"Taken Date"而不是"Modified Date"



我使用exif_read_data PHP函数从照片中检索创建日期(请参阅下面的代码)。从未修改的照片中检索的日期返回"拍摄日期"。已修改的-"修改日期"。有没有一种方法可以忽略"修改日期"字段来获取照片的拍摄日期?

$exif_data = exif_read_data ($filename);
if (!empty($exif_data['DateTime'])) {
$exif_date = $exif_data['DateTime'];
}

谢谢。

编辑:我认为$exif_data['DateTime']使用了第一个可用的日期字段。由于未修改的图像具有相同的"修改日期"one_answers"拍摄日期"值,在我的情况下,它总是检索"修改日期"。

好吧,我知道这有点晚了,因为这个问题是一年前发布的,但我发布这个答案是因为我有同样的问题,我丈夫向我展示了如何获得答案的一两个技巧,所以我分享它。编写一个php脚本来打印exif_read_data数组,您会发现各种有趣的信息。这(下面)是使用print_r()在stdout的命令行上打印的。如果向下滚动,您将看到两个非常有趣的键:[DateTime]=>2011:06:21 17:50:57和[DateTimeOriginal]=>20111:06:04 08:56:22

我希望这些能帮助你得到你需要的东西。

阵列([FileName]=>海盗(F).JPG[文件日期时间]=>1405733742[FileSize]=>4017033[FileType]=>2[MimeType]=>图像/jpeg[SectionsFound]=>ANY_TAG、IFD0、THUMBNAIL、COMMENT、EXIF[CCOMPUTED]=>数组([html]=>width="2592"height="3888"[高度]=>3888[宽度]=>2592[IsColor]=>1[ByteOrderMotorola]=>1[ApertureFNumber]=>f/16.0[缩略图.FileType]=>2[缩略图.MimeType]=>图像/jpeg)[制造]=>佳能〔型号〕=>佳能EOS DIGITAL REBEL XS[方向]=>1[X分辨率]=>4718592/65536[Y解决方案]=>4718592/65536[分辨率单位]=>2[软件]=>QuickTime 7.6.9[日期时间]=>2011:06:21 17:50:57[主机]=>Mac OS X 10.5.8[YCbCr定位]=>1[Exif_IFD_Pointer]=>260[THUMBNAIL]=>阵列([压缩]=>6[X分辨率]=>4718592/65536[Y解决方案]=>4718592/65536[分辨率单位]=>2[JPEGInterchangeFormat]=>628[JPEGInterchangeFormatLength]=>4867[YCbCr定位]=>1)[评论]=>数组([0]=>AppleMark)[曝光时间]=>1/200[F编号]=>16/1[曝光程序]=>2[ISOSpeedRatings]=>400[ExifVersion]=>0220[DateTimeOriginal]=>2011:06:04 08:56:22[数字化日期时间]=>2011:06:04 08:56:22[ShutterSpeedValue]=>499712/65536[机会值]=>524288/65536[ExposureBiasValue]=>0/1[计量模式]=>5[闪光]=>9[焦距]=>18/1[ColorSpace]=>1)

解决方案比我想象的更容易。我指的是一个错误的标签。获取日期使用:

$exif_data[原始日期];

echo "test1.jpg:<br />n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "No header data found.<br />n" : "Image contains headers<br />n";
$exif = exif_read_data('tests/test2.jpg', 0, true);
echo "test2.jpg:<br />n";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />n";
}
}

将输出

test1.jpg:
No header data found.
test2.jpg:
FILE.FileName: test2.jpg
FILE.FileDateTime: 1017666176
FILE.FileSize: 1240
FILE.FileType: 2
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
COMPUTED.html: width="1" height="1"
COMPUTED.Height: 1
COMPUTED.Width: 1
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.UserComment: Exif test image.
COMPUTED.UserCommentEncoding: ASCII
COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
COMPUTED.Copyright.Editor: Edited by M.Boerger.
IFD0.Copyright: Photo (c) M.Boerger
IFD0.UserComment: ASCII
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.JPEGInterchangeFormatLength: 523
COMMENT.0: Comment #1.
COMMENT.1: Comment #2.
COMMENT.2: Comment #3end
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.Thumbnail.Height: 1
THUMBNAIL.Thumbnail.Height: 1

来源http://php.net/manual/en/function.exif-read-data.php

我不确定您的信息是从哪里得到的,但exif信息取决于图像或捕获的设备。即使它被修改了,exif也可以是条纹

示例

array (size=7)
'FileName' => string 'img.jpg' (length=7)
'FileDateTime' => int 1332747844
'FileSize' => int 22569
'FileType' => int 2
'MimeType' => string 'image/jpeg' (length=10)
'SectionsFound' => string 'IFD0' (length=4)
'COMPUTED' => 
array (size=5)
'html' => string 'width="338" height="506"' (length=24)
'Height' => int 506
'Width' => int 338
'IsColor' => int 1
'ByteOrderMotorola' => int 0

这是一个有效的exif信息,但不包括

  • 日期时间
  • 拍摄日期
  • 修改日期
  • 原始日期时间
  • 日期时间数字化

你真的需要重新思考你的策略,并与FileDateTime合作,这是我所知道的唯一信息,始终存在

DateTime信息存在于图像文件目录(IFD)中,该目录是EXIF数据中的重复数据结构。要获取照片的拍摄日期并表示为本地phpDateTime对象,您需要从右侧IFD部分获取它:

<?php
$filename  = "/path/to/your/image.jpg";
$exifData  = exif_read_data( $filename, 'IFD0');
$takenDate = NULL;
if( $exifData !== FALSE ) {
if( array_key_exists('DateTime', $exifData ) ) {
$takenDate = new DateTime( $exifData['DateTime'] );
} else {
// No DateTime field available
}
} else {
// No exif data available
}

之后,您可以简单地验证exif DateTime数据:

is_null( $takenDate );