使用PHP exif_read_data获取照片的“拍摄日期”而不是“修改日期”

16

我正在使用 exif_read_data PHP 函数从照片中检索创建日期(见下面的代码)。从未修改过的照片中检索到的日期返回“Date Taken”。而那些被修改过的照片则返回“Date Modified”。是否有一种方法可以获取照片拍摄的日期,忽略“Date Modified”字段?

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

谢谢。

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

5个回答

14

好的,我知道这个问题有点晚,因为它是一年前发布的,但是我还是想回答这个问题,因为我也有同样的问题,我的丈夫向我展示了一些技巧来获取答案,所以我要分享一下。

编写一个php脚本来打印exif_read_data数组,您将发现各种有趣的信息。以下是使用print_r()命令行打印到stdout的结果。如果您向下滚动,您会看到两个非常有趣的键:

[DateTime] => 2011:06:21 17:50:57 和 [DateTimeOriginal] => 2011:06:04 08:56:22

我希望这些能够帮助您获得所需的内容。

Array
(
    [FileName] => Pirate(F).JPG
    [FileDateTime] => 1405733742
    [FileSize] => 4017033
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, COMMENT, EXIF
    [COMPUTED] => Array
        (
            [html] => width="2592" height="3888"
            [Height] => 3888
            [Width] => 2592
            [IsColor] => 1
            [ByteOrderMotorola] => 1
            [ApertureFNumber] => f/16.0
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )
[Make] => Canon [Model] => Canon EOS DIGITAL REBEL XS [Orientation] => 1 [XResolution] => 4718592/65536 [YResolution] => 4718592/65536 [ResolutionUnit] => 2 [Software] => QuickTime 7.6.9 [DateTime] => 2011:06:21 17:50:57 [HostComputer] => Mac OS X 10.5.8 [YCbCrPositioning] => 1 [Exif_IFD_Pointer] => 260 [THUMBNAIL] => Array ( [Compression] => 6[XResolution] => 4718592/65536 表示图像水平方向的分辨率为 4718592/65536。 [YResolution] => 4718592/65536 表示图像垂直方向的分辨率为 4718592/65536。 [ResolutionUnit] => 2 表示分辨率单位是英寸。 [JPEGInterchangeFormat] => 628 表示 JPEG 格式数据起始位置在文件中的偏移量为 628。 [JPEGInterchangeFormatLength] => 4867 表示 JPEG 格式数据的长度为 4867 个字节。 [YCbCrPositioning] => 1 表示 Y 和 Cb/Cr 采样点的位置关系为 co-sited。
[COMMENT] => Array ( [0] => AppleMark ) 表示图片带有 Applemark 的注释。
[ExposureTime] => 1/200 表示曝光时间为 1/200 秒。 [FNumber] => 16/1 表示光圈值为 F16。 [ExposureProgram] => 2 表示拍摄模式为光圈优先模式。 [ISOSpeedRatings] => 400 表示 ISO 感光度为 400。 [ExifVersion] => 0220 表示使用的 Exif 版本号为 2.20。 [DateTimeOriginal] => 2011:06:04 08:56:22 表示拍摄时间为 2011 年 6 月 4 日上午 8 点 56 分 22 秒。 [DateTimeDigitized] => 2011:06:04 08:56:22 表示数字化时间为 2011 年 6 月 4 日上午 8 点 56 分 22 秒。 [ShutterSpeedValue] => 499712/65536 表示快门速度为 1/125 秒。 [ApertureValue] => 524288/65536 表示光圈值为 F8。 [ExposureBiasValue] => 0/1 表示曝光补偿值为 0。 [MeteringMode] => 5 表示使用的测光模式是评价测光。 [Flash] => 9 表示闪光灯未触发,但存在闪光灯功能。 [FocalLength] => 18/1 表示焦距为 18 毫米。 [ColorSpace] => 1 表示颜色空间为 sRGB。

11

解决方案比我想的要简单。我引用了错误的标记。要获取拍摄日期,请使用:

$exif_data['DateTimeOriginal'];


3
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/zh/function.exif-read-data.php

exif_read_data() 函数从 JPEG 或 TIFF 文件中读取 EXIF (Exchangeable image file format) 头信息。该函数可以用于获取照片的元数据,例如拍摄日期、制造商和型号等信息。

非常感谢,我已经将我的婚礼照片排列正确! - user2812532

2
EXIF数据中,存在于图像文件目录(IFD)中的DateTime信息是一个重复出现的数据结构。要获取照片拍摄日期并表示为本地php DateTime对象,您需要从正确的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 );

DateTime() 无法将 Unix 时间戳转换 - TV-C-1-5

2
我不确定您获取信息的来源,但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信息,但不包括以下内容:
  • Datetime
  • DateTaken
  • DateModified
  • DateTimeOriginal
  • DateTimeDigitized
你真的需要重新考虑你的策略,并使用FileDateTime,这是我知道始终存在的唯一信息。

1
FileDateTime 可能只获取文件的修改时间,而且(可能)是一个系统命令。摄影设备总是有“拍摄日期”字段,我需要检索它。上面的函数对于未经修改的照片来说完全正常(符合我的需求)。当我在 Photoshop 中编辑并重新保存它们时,该函数使用“修改日期”字段。文件仍然具有正确时间的“拍摄日期”字段,因此肯定可以检索它。 - Dima
请再次验证...我已经测试了1000多张图片...一个典型的例子是三星GT-N7000手机,它只有Datetime,DateTimeOriginal,DateTimeDigitized..我相信您可以轻松地自行验证...请注意,某些设备上可以轻松地打开exif信息。 - Baba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接