14

我正在使用 exif_read_data PHP 函数从照片中检索创建日期(请参见下面的代码。)从未修改的照片中检索到的日期返回“拍摄日期”。那些已被修改的 - “修改日期”。有没有办法获取照片的拍摄日期,而忽略“修改日期”字段?

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

谢谢你。

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

4

5 回答 5

13

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

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

大批
(
    [文件名] => 海盗(F).JPG
    [文件日期时间] => 1405733742
    [文件大小] => 4017033
    [文件类型] => 2
    [MimeType] => 图像/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, COMMENT, EXIF
    [计算] => 数组
        (
            [html] => 宽度=“2592”高度=“3888”
            [身高] => 3888
            [宽度] => 2592
            [IsColor] => 1
            [字节顺序摩托罗拉] => 1
            [ApertureFNumber] => f/16.0
            [缩略图.文件类型] => 2
            [Thumbnail.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
    [缩略图] => 数组
        (
            [压缩] => 6
            [X分辨率] => 4718592/65536
            [Y分辨率] => 4718592/65536
            [分辨率单位] => 2
            [JPEG 交换格式] => 628
            [JPEGInterchangeFormatLength] => 4867
            [YCbCr定位] => 1
        )

    [评论] => 数组
        (
            [0] => 苹果标记

        )

    [曝光时间] => 1/200
    [FNumber] => 16/1
    [曝光程序] => 2
    [ISOSpeedRatings] => 400
    [ExifVersion] => 0220
    [DateTimeOriginal] => 2011:06:04 08:56:22
    [日期时间数字化] => 2011:06:04 08:56:22
    [快门速度值] => 499712/65536
    [光圈值] => 524288/65536
    [ExposureBiasValue] => 0/1
    [测光模式] => 5
    [闪光] => 9
    [焦距] => 18/1
    [色彩空间] => 1
)
于 2014-07-19T02:25:32.503 回答
11

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

$exif_data['DateTimeOriginal'];

于 2012-12-03T02:44:45.737 回答
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/en/function.exif-read-data.php

于 2012-12-02T22:04:50.593 回答
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信息,但不包括

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

您确实需要重新考虑您的策略并使用FileDateTime唯一知道的始终存在的信息

于 2012-12-02T22:12:35.847 回答
2

日期时间信息存在于图像文件目录 (IFD) 中,它是EXIF数据中的重复数据结构。要获取照片的拍摄日期并表示为原生 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 );
于 2012-12-03T02:02:37.477 回答