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 헤더에 의존할 수는 없습니다.
Height
및 Width
는 getimagesize()와 동일한 방식으로 계산되므로 해당 값은 반환된 헤더의 일부가 아니어야 합니다. 또한 html은 일반 HTML 내부에서 사용되는 높이/너비 문자열입니다.
Exif 헤더에 Copyright
메모가 포함되어 있으면 이 헤더 자체에 두 개의 값이 포함될 수 있습니다. 솔루션이 Exif 2.10 표준과 일치하지 않기 때문에 COMPUTED 섹션은 Copyright.Photographer
및 Copyright.Editor
항목을 모두 반환하는 반면 IFD0 섹션에는 두 항목을 분할하는 NULL 문자가 있는 바이트 배열이 포함됩니다. 또는 데이터 유형이 잘못된 경우 첫 번째 항목만 표시됩니다(Exif의 정상적인 동작). COMPUTED에는 원본 저작권 문자열 또는 쉼표로 구분된 사진 및 편집자 저작권 목록인 Copyright 항목도 포함됩니다.
UserComment
태그는 Copyright tag와 동일한 문제가 있습니다. 두 개의 값을 저장할 수 있습니다. 먼저 인코딩이 사용되었고 두 번째는 값 자체입니다. 그렇다면 IFD
섹션에는 인코딩 또는 바이트 배열만 포함됩니다. COMPUTED 섹션은 UserCommentEncoding
및 UserComment
항목에 모두 저장됩니다. 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
,THUMBNAIL
및COMMENT
는 이름이 다른 섹션과 충돌하는 값을 포함할 수 있으므로 항상 배열이 됩니다. 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 형식에 대한 지원이 추가되었습니다.
|
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_motorola 및 exif.decode_unicode_intel에 지정된 대로 문자 집합을 선택합니다. exif 확장은 자체적으로 인코딩을 알아내려고 시도하지 않으며 exif_read_data()를 호출하기 전에 이 두 ini 지시문 중 하나를 설정하여 디코딩에 사용할 인코딩을 올바르게 지정하는 것은 사용자의 몫입니다.
메모 file
이 이 함수에 스트림을 전달하는 데 사용되는 경우 스트림은 탐색 가능해야 합니다. 이 함수가 반환된 후에도 파일 포인터 위치는 변경되지 않습니다.
기타
- exif_thumbnail() - 이미지의 포함된 축소판 검색
- getimagesize() - 이미지 크기 가져오기
- Supported Protocols and Wrappers