Exif exif_read_data

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_read_data — 이미지 파일에서 EXIF ​​헤더를 읽습니다.


설명

exif_read_data(
    resource|string $file,
    ?string $required_sections = null,
    bool $as_arrays = false,
    bool $read_thumbnail = false
): array|false
                

exif_read_data()는 이미지 파일에서 EXIF ​​헤더를 읽습니다. 이 방법으로 디지털 카메라에서 생성된 메타 데이터를 읽을 수 있습니다.

EXIF 헤더는 디지털 카메라에서 생성된 JPEG/TIFF 이미지에 존재하는 경향이 있지만 불행히도 각 디지털 카메라 제조업체는 실제로 이미지에 태그를 지정하는 방법에 대해 서로 다른 아이디어를 가지고 있으므로 항상 존재하는 특정 Exif 헤더에 의존할 수는 없습니다.

HeightWidthgetimagesize()와 동일한 방식으로 계산되므로 해당 값은 반환된 헤더의 일부가 아니어야 합니다. 또한 html은 일반 HTML 내부에서 사용되는 높이/너비 문자열입니다.

Exif 헤더에 Copyright 메모가 포함되어 있으면 이 헤더 자체에 두 개의 값이 포함될 수 있습니다. 솔루션이 Exif 2.10 표준과 일치하지 않기 때문에 COMPUTED 섹션은 Copyright.PhotographerCopyright.Editor 항목을 모두 반환하는 반면 IFD0 섹션에는 두 항목을 분할하는 NULL 문자가 있는 바이트 배열이 포함됩니다. 또는 데이터 유형이 잘못된 경우 첫 번째 항목만 표시됩니다(Exif의 정상적인 동작). COMPUTED에는 원본 저작권 문자열 또는 쉼표로 구분된 사진 및 편집자 저작권 목록인 Copyright 항목도 포함됩니다.

UserComment 태그는 Copyright tag와 동일한 문제가 있습니다. 두 개의 값을 저장할 수 있습니다. 먼저 인코딩이 사용되었고 두 번째는 값 자체입니다. 그렇다면 IFD 섹션에는 인코딩 또는 바이트 배열만 포함됩니다. COMPUTED 섹션은 UserCommentEncodingUserComment 항목에 모두 저장됩니다. UserComment 항목은 두 경우 모두 사용할 수 있으므로 IFD0 섹션의 값보다 우선적으로 사용해야 합니다.

exif_read_data()는 EXIF ​​사양에 따라 EXIF ​​데이터 태그의 유효성도 검사합니다(» http://exif.org/Exif2-2.PDF, 20페이지).


매개변수

file
이미지 파일의 위치입니다. 이것은 파일의 경로(스트림 래퍼도 평소와 같이 지원됨) 또는 스트림 리소스일 수 있습니다.
required_sections
결과 배열을 생성하기 위해 파일에 있어야 하는 쉼표로 구분된 섹션 목록입니다. 요청된 섹션을 찾을 수 없으면 반환 값은 false입니다.
FILE FileName, FileSize, FileDateTime, SectionsFound
COMPUTED html, Width, Height, IsColor 등을 사용할 수 있습니다. Height 및 Width는 getimagesize()와 동일한 방식으로 계산되므로 해당 값은 반환된 헤더의 일부가 아니어야 합니다. 또한 html은 일반 HTML 내부에서 사용되는 높이/너비 문자열입니다.
ANY_TAG 태그가 있는 모든 정보(예: IFD0, EXIF, ...
IFD0 IFD0의 모든 태그 데이터. 일반 이미지 파일에는 이미지 크기 등이 포함됩니다.
THUMBNAIL 파일에 두 번째 IFD가 있는 경우 파일에 썸네일이 포함되어야 합니다. 포함된 축소판에 대한 모든 태그가 지정된 정보는 이 섹션에 저장됩니다.
COMMENT JPEG 이미지의 주석 헤더.
EXIF EXIF 섹션은 IFD0의 하위 섹션입니다. 이미지에 대한 자세한 정보가 포함되어 있습니다. 이러한 항목의 대부분은 디지털 카메라와 관련된 것입니다.
as_arrays
각 섹션이 배열이 될 것인지 여부를 지정합니다. required_sections COMPUTED, THUMBNAILCOMMENT는 이름이 다른 섹션과 충돌하는 값을 포함할 수 있으므로 항상 배열이 됩니다.
read_thumbnail
true로 설정하면 썸네일 자체를 읽습니다. 그렇지 않으면 태그가 지정된 데이터만 읽습니다.

반환 값

배열 인덱스가 헤더 이름이고 배열 값이 해당 헤더와 연결된 값인 연관 배열을 반환합니다. 데이터를 반환할 수 없으면 exif_read_data()false를 반환합니다.


오류/예외

E_WARNING 및/또는 E_NOTICE 수준의 오류는 지원되지 않는 태그 또는 기타 잠재적인 오류 조건에 대해 발생할 수 있지만 함수는 여전히 모든 이해할 수 있는 정보를 읽으려고 시도합니다.


변경 로그

버전 설명
8.0.0 required_sections는 이제 nullable입니다.
7.2.0 file 매개변수는 이제 로컬 파일과 스트림 리소스를 모두 지원합니다.
7.2.0 다음 EXIF ​​형식에 대한 지원이 추가되었습니다.
  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

Examples

예제 #1 exif_read_data() 예제

                  
<?php
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
                

예제 #2 PHP 7.2.0부터 사용 가능한 스트림이 있는 exif_read_data()

                  
<?php
// Open a the file, this should be in binary mode
$fp = fopen('/path/to/image.jpg', 'rb');

if (!$fp) {
    echo 'Error: Unable to open image for reading';
    exit;
}

// Attempt to read the exif headers
$headers = exif_read_data($fp);

if (!$headers) {
    echo 'Error: Unable to read exif headers';
    exit;
}

// Print the 'COMPUTED' headers
echo 'EXIF Headers:' . PHP_EOL;

foreach ($headers['COMPUTED'] as $header => $value) {
    printf(' %s => %s%s', $header, $value, PHP_EOL);
}
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

EXIF Headers:
 Height => 576
 Width => 1024
 IsColor => 1
 ByteOrderMotorola => 0
 ApertureFNumber => f/5.6
 UserComment =>
 UserCommentEncoding => UNDEFINED
 Copyright => Denis
 Thumbnail.FileType => 2
 Thumbnail.MimeType => image/jpeg
                

메모

메모

mbstring이 활성화되면 exif는 유니코드 처리를 시도하고 exif.decode_unicode_motorolaexif.decode_unicode_intel에 지정된 대로 문자 집합을 선택합니다. exif 확장은 자체적으로 인코딩을 알아내려고 시도하지 않으며 exif_read_data()를 호출하기 전에 이 두 ini 지시문 중 하나를 설정하여 디코딩에 사용할 인코딩을 올바르게 지정하는 것은 사용자의 몫입니다.

메모 file이 이 함수에 스트림을 전달하는 데 사용되는 경우 스트림은 탐색 가능해야 합니다. 이 함수가 반환된 후에도 파일 포인터 위치는 변경되지 않습니다.


기타