[PHP] Odczyt danych EXIF ze zdjęć

Czy wiesz, że plik JPG zawiera coś więcej niż tylko obraz? Aparat podczas robienia zdjęcia zapisuje pewne dane dot. Ekspozycji czy też orientacji aparatu. Dzisiaj pokażę jak te dane odczytać.

PHP posiada wbudowaną funkcję do odczytu metadanych zdjęć – exif_read_data().

Poniższa funkcja zwraca tablicę dwuwymiarową zawierającą nazwę parametru i dane.

Kod:

function pobierz_exif($plik) { $exif = exif_read_data($plik, 'IFD0'); if($exif===false) //Je?li obraz ni zawiera exif zwraca pust? tablic? { return array(); } $exif = exif_read_data($plik, 0, true); foreach ($exif as $key => $section) { foreach ($section as $name => $val) { $dane[] = array("nazwa" => $key.$name, "wartosc" => $val); } $x++; } return $dane; }

Funkcja na początku swojego działania stara się odczytać dane i sprawdza czy zdjęcie je zawiera. Jeśli plik nie zawiera metadanych funkcja zwraca pustą tablicę (o zerowej liczbie elementów).

Wykonajmy dla przykładu taki kod:

var_dump(pobierz_exif('test.jpg'));

Jeśli plik test.jpg istnieje i zawiera dane zobaczymy listing podobny do tego:

Kod:

array(55) { [0]=> array(2) { ["nazwa"]=> string(12) "FILEFileName" – nazwa pliku ["wartosc"]=> string(8) "test.jpg" } [1]=> array(2) { ["nazwa"]=> string(16) "FILEFileDateTime" – data i czas wykonania zdjęcia ["wartosc"]=> int(1244806556) } [2]=> array(2) { ["nazwa"]=> string(12) "FILEFileSize" – rozmiar pliku w bajtach ["wartosc"]=> int(79446) } [3]=> array(2) { ["nazwa"]=> string(12) "FILEFileType" – kod rozszerzenia – w moim przypadku 2 (jpg) ["wartosc"]=> int(2) } [4]=> array(2) { ["nazwa"]=> string(12) "FILEMimeType" – typ mime zdjęcia ["wartosc"]=> string(10) "image/jpeg" } [5]=> array(2) { ["nazwa"]=> string(17) "FILESectionsFound" – znalezione sekcje ["wartosc"]=> string(30) "ANY_TAG, IFD0, THUMBNAIL, EXIF" } [6]=> array(2) { ["nazwa"]=> string(12) "COMPUTEDhtml" – rozmiary zdjęcia gotowe do wstawienia na stronę (html) ["wartosc"]=> string(24) "width="672" height="512"" } [7]=> array(2) { ["nazwa"]=> string(14) "COMPUTEDHeight" – wyliczona wysokość ["wartosc"]=> int(512) } [8]=> array(2) { ["nazwa"]=> string(13) "COMPUTEDWidth" – wyliczona szerokość ["wartosc"]=> int(672) } [9]=> array(2) { ["nazwa"]=> string(15) "COMPUTEDIsColor" – przestrzeń kolorystyczna ["wartosc"]=> int(1) } [10]=> array(2) { ["nazwa"]=> string(25) "COMPUTEDByteOrderMotorola" – organizacja danych wg, standardu motorolli ["wartosc"]=> int(1) } [11]=> array(2) { ["nazwa"]=> string(20) "COMPUTEDExposureTime" – czas ekspozycji ["wartosc"]=> string(14) "0.031 s (1/32)" } [12]=> array(2) { ["nazwa"]=> string(23) "COMPUTEDApertureFNumber" – wartość przysłony ["wartosc"]=> string(5) "f/2.4" } [13]=> array(2) { ["nazwa"]=> string(26) "COMPUTEDThumbnail.FileType" – typ miniatury (kompresja) – tutaj tiff (8) ["wartosc"]=> int(8) } [14]=> array(2) { ["nazwa"]=> string(26) "COMPUTEDThumbnail.MimeType" – typ mime miniatury ["wartosc"]=> string(10) "image/tiff" } [15]=> array(2) { ["nazwa"]=> string(24) "COMPUTEDThumbnail.Height" – wyliczona wysokość miniatury ["wartosc"]=> int(60) } [16]=> array(2) { ["nazwa"]=> string(23) "COMPUTEDThumbnail.Width" – wyliczona szerokość miniatury ["wartosc"]=> int(80) } [17]=> array(2) { ["nazwa"]=> string(20) "IFD0ImageDescription" – opis zdjęcia (czasami dodawany przez aparaty) ["wartosc"]=> NULL } [18]=> array(2) { ["nazwa"]=> string(8) "IFD0Make" – producent aparatu ["wartosc"]=> string(4) "SONY" } [19]=> array(2) { ["nazwa"]=> string(9) "IFD0Model" – model aparatu ["wartosc"]=> string(8) "DSC-D700" } [20]=> array(2) { ["nazwa"]=> string(15) "IFD0Orientation" – orientacja aparatu w osi pion/poziom (1 – poziomo) ["wartosc"]=> int(1) } [21]=> array(2) { ["nazwa"]=> string(15) "IFD0XResolution" - DPIx ["wartosc"]=> string(4) "72/1" } [22]=> array(2) { ["nazwa"]=> string(15) "IFD0YResolution" - DPIy ["wartosc"]=> string(4) "72/1" } [23]=> array(2) { ["nazwa"]=> string(18) "IFD0ResolutionUnit" – jednostki rozdzielczości ["wartosc"]=> int(2) } [24]=> array(2) { ["nazwa"]=> string(12) "IFD0DateTime" – data i godzina wykonania zdjęcia w czytelnym dla człowieka formacie ["wartosc"]=> string(19) "1998:12:01 14:22:36" } [25]=> array(2) { ["nazwa"]=> string(20) "IFD0YCbCrPositioning" – pozycja palety kolorów YCbCr ["wartosc"]=> int(1) } [26]=> array(2) { ["nazwa"]=> string(20) "IFD0Exif_IFD_Pointer" – wersja IFD/EXIF ["wartosc"]=> int(206) } [27]=> array(2) { ["nazwa"]=> string(19) "THUMBNAILImageWidth" – szerokość miniatury ["wartosc"]=> int(80) } [28]=> array(2) { ["nazwa"]=> string(20) "THUMBNAILImageLength" – wysokość miniatury ["wartosc"]=> int(60) } [29]=> array(2) { ["nazwa"]=> string(22) "THUMBNAILBitsPerSample" – Bit/próbkę ["wartosc"]=> array(3) { [0]=> int(8) [1]=> int(8) [2]=> int(8) } } [30]=> array(2) { ["nazwa"]=> string(20) "THUMBNAILCompression" – kompresja miniatury ["wartosc"]=> int(1) } [31]=> array(2) { ["nazwa"]=> string(34) "THUMBNAILPhotometricInterpretation" – numeryczna interpretacja miniatury ["wartosc"]=> int(2) } [32]=> array(2) { ["nazwa"]=> string(21) "THUMBNAILStripOffsets" – ilość offsetów ["wartosc"]=> int(648) } [33]=> array(2) { ["nazwa"]=> string(24) "THUMBNAILSamplesPerPixel" – ilość próbek/pixel w miniaturze ["wartosc"]=> int(3) } [34]=> array(2) { ["nazwa"]=> string(21) "THUMBNAILRowsPerStrip" – liczba kolumn w miniaturze ["wartosc"]=> int(60) } [35]=> array(2) { ["nazwa"]=> string(24) "THUMBNAILStripByteCounts" – waga miniatury ["wartosc"]=> int(14400) } [36]=> array(2) { ["nazwa"]=> string(20) "THUMBNAILXResolution" – DPIx miniatury ["wartosc"]=> string(4) "72/1" } [37]=> array(2) { ["nazwa"]=> string(20) "THUMBNAILYResolution" – DPIy miniatury ["wartosc"]=> string(4) "72/1" } [38]=> array(2) { ["nazwa"]=> string(23) "THUMBNAILResolutionUnit" – jednostki rozdzielczości miniatury ["wartosc"]=> int(2) } [39]=> array(2) { ["nazwa"]=> string(19) "EXIFExposureProgram" – program tematyczny na podczas którego wykonano zdjęcie ["wartosc"]=> int(3) } [40]=> array(2) { ["nazwa"]=> string(19) "EXIFISOSpeedRatings" - migawka ["wartosc"]=> int(200) } [41]=> array(2) { ["nazwa"]=> string(15) "EXIFExifVersion" – wersja Exif ["wartosc"]=> string(4) "0200" } [42]=> array(2) { ["nazwa"]=> string(20) "EXIFDateTimeOriginal" – oryginalny czas i data zrobienia zdjęcia ["wartosc"]=> string(19) "1998:12:01 14:22:36" } [43]=> array(2) { ["nazwa"]=> string(21) "EXIFDateTimeDigitized" – data i godzina zapisu zdjęcia do jpg ["wartosc"]=> string(19) "1998:12:01 14:22:37" }

Zalecam przed kopiowaniem gotowego kodu przeanalizowanie zasady jego działania a w szczególności zwracanej tablicy.

0
Zamknij

Choć staramy się je ograniczać, wykorzystujemy mechanizmy takie jak ciasteczka, które pozwalają naszym partnerom na śledzenie Twojego zachowania w sieci. Dowiedz się więcej.