Standardy EXIF oraz IPTC umożliwiają zapis metadanych w obrazach cyfrowych. Plik graficzny (np. JPEG) może zawierać – oprócz samej fotografii – informacje o autorze, słowa kluczowe, opis oraz parametry i ustawienia aparatu. Artykuł opisuje metody odczytu oraz modyfikacji danych EXIF i IPTC przy użyciu kilku programów użytkowych oraz skryptów w języku PHP.
EXIF (Exchangeable Image File Format)
Standard EXIF
Ucząc się podstaw fotografii cyfrowej warto poznać wpływ ustawień aparatu na osiągane rezultaty. W przypadku fotografii analogowej niezbędny jest notes i ołówek. Po wykonaniu fotografii należy zapisać ustawienia aparatu, czyli m.in. czas naświetlania, przysłonę i zastosowane filtry, gdyż dane te są niedostępne po wywołaniu filmu.
W dobie fotografii cyfrowej ołówek i notes stają się zbędne. Aparaty cyfrowe automatycznie zapisują w każdej wykonanej fotografii wiele informacji technicznych. Pliki JPEG, TIFF oraz RAW mogą zawierać, oprócz samego zdjęcia, także:
- dane aparatu: producenta i model,
- informacje o oprogramowaniu aparatu (np. wersję oprogramowania firmware),
- datę i godzinę wykonania,
- ustawienia aparatu: przysłonę, czas, tryb (manualny, automatyczny itd.), ogniskową itd.,
- opis zdjęcia,
- informacje o prawach autorskich,
- a nawet dane geolokacyjne pochodzące z odbiornika GPS.
Informacje te są zapisywane w formacie EXIF. Jest to standard przygotowany przez japońską organizację JEIDA (ang. Japan Electronic Industry Development Association). Obowiązującą obecnie wersją jest EXIF 2.2, której specyfikacja jest dostępna pod adresem http://www.exif.org/Exif2-2.PDF.
Odczyt danych EXIF
Informacje EXIF zawarte w pliku JPG mogą być odczytane przy użyciu wielu programów, m.in. IrfanView, ExifRead, wtyczki FxIFFirefoksa oraz wbudowanych możliwości systemu Windows.
Instalujemy program IrfanView (http://www.irfanview.com) wraz z pełnym zestawem wtyczek, a następnie otwieramy jeden z przykładowych plików graficznych, np. nikon_e4100.jpg (rys. 1). Następnie w programie IrfanView wybieramy opcję Image / Information… W oknie dialogowym naciskamy przycisk EXIF info (rys. 2). Pojawi się wówczas okno dialogowe widoczne na rys. 3, które zawiera komplet informacji EXIF odczytanych z pliku nikon_e4100.jpg.
Program ExifRead (dostępny pod adresem http://www.tawbaware.com/exifread.htm) jest rozpowszechniany w postaci pliku wykonywalnego i nie wymaga instalacji. Zdjęcie nikon_e4100.jpg otworzone w programie nikon_e4100.jpg jest widoczne na rys. 4.
Kolejną metodą odczytu danych EXIF jest użycie wtyczki ExIFFirefoksa. Po jej zainstalowaniu opcja właściwości widoczna na rys. 5 powoduje wyświetlenie okna dialogowego przedstawionego na rys. 6, które zawiera między innymi dane EXIF.
Jeszcze innym sposobem odczytu danych EXIF jest wykorzystanie wbudowanych możliwości systemu Windows. Część informacji EXIF jest dostępna w oknie dialogowym właściwości pliku (rys. 6), jakie można wyświetlić po kliknięciu nazwy pliku prawym przyciskiem myszki (rys. 5).
Odczyt danych EXIF w PHP
Dane EXIF mogą być odczytywane i zapisywane programowo w wielu językach, także w PHP. W pliku konfiguracyjnym php.ini wprowadzamy wpis:
extension = php_exif.dll
Znajduje się on w sekcji Dynamic Extensions. Restartujemy serwer Apache.
Po wywołaniu funkcji {stala}exif_read_data(){/stala}:
$exif = exif_read_data(\'foto.jpg\', \'IFD0\');
w zmiennej {stala}$exif{/stala} zostaną umieszczone informacje EXIF odczytane z pliku foto.jpg. Zmienna {stala}$exif{/stala} jest tablicą asocjacyjną, której zawartość poznamy korzystając z funkcji {stala}var_dump(){/stala}:
var_dump($exif);
W tablicy {stala}$exif{/stala} znajdują się między innymi elementy o indeksach:
Make - producent
Model - model aparatu
DateTime - data i godzina wykonania zdjęcia
ExposureTime - czas ekspozycji
FNumber - wartość przysłony
ISOSpeedRatings - czułość ISO
FocalLength - długość ogniskowej
Dane te można wyświetlić na stronie WWW przy użyciu instrukcji echo:
echo \'Sprzęt: \' . $exif[\'Make\'];
echo \'Model: \' . $exif[\'Model\'];
echo \'Data i godzina: \' . $exif[\'DateTime\'];
echo \'Czas naświetlania: \' . $exif[\'ExposureTime\'];
echo \'Przysłona: \' . $exif[\'FNumber\'];
echo \'Czułość: \' . $exif[\'ISOSpeedRatings\'];
echo \'Ogniskowa: \' . $exif[\'FocalLength\'];
Nie każdy plik JPG musi zawierać dane EXIF. W przypadku gdy dane EXIF nie zostają odnalezione w podanym pliku, funkcja {stala}exif_read_data(){/stala} zwraca wartość false. Skrypt stwierdzający obecność danych EXIF w pliku i wyświetlający wyżej wymienione informacje jest przedstawiony na listingu 1.
$fn = \'foto.jpg\';
$exif = exif_read_data($fn, \'IFD0\');
if (!$exif) {
echo \'Brak danych!\';
} else {
echo \'Sprzęt: \' . $exif[\'Make\'];
echo \'Model: \' . $exif[\'Model\'];
echo \'Data i godzina: \' . $exif[\'DateTime\'];
echo \'Czas naświetlania: \' . $exif[\'ExposureTime\'];
echo \'Przysłona: \' . $exif[\'FNumber\'];
echo \'Czułość: \' . $exif[\'ISOSpeedRatings\'];
echo \'Ogniskowa: \' . $exif[\'FocalLength\'];
}
IPTC (International Press Telecommunications Council)
Standard IPTC
Standard IPTC, podobnie jak EXIF, umożliwia umieszczanie w plikach graficznych dodatkowych danych. Dane IPTC zawierają opis zdjęcia, który obejmuje między innymi:
- tytuł zdjęcia,
- informacje o prawach autorskich,
- informacje o autorze,
- słowa kluczowe,
- podział na kategorie.
Odczyt danych IPTC
Do odczytu danych IPTC można użyć programów IrfanView oraz ExifReader.
W celu dotarcia do informacji IPTC otwieramy plik graficzny foto.jpg w programie IrfanView. Następnie wybieramy opcję Image / Information… W oknie dialogowym naciskamy przycisk IPTC info (rys. 7). Pojawi się wówczas okno dialogowe, które jest przedstawione na rys. 8. Zawiera ono informacje IPTC.
Odczyt danych IPTC w PHP
Do odczytania danych IPTC w PHP należy użyć dwóch funkcji: {stala}getimagesize(){/stala} oraz {stala}iptcparse(){/stala}. Pierwsza z nich odczytuje dodatkowe dane zawarte w pliku graficznym i umieszcza je w drugim, opcjonalnym parametrze (tj. w zmiennej {stala}$info{/stala}):
$size = getimagesize(\'foto.jpg\', $info);
Zmienna {stala}$info{/stala} jest tablicą asocjacyjną. Jeśli w pliku graficznym foto.jpg są zawarte dane IPTC, wówczas zostaną one umieszczone w elemencie $info[\’APP13\’]. Dane te należy poddać analizie przy użyciu funkcji {stala}iptcparse(){/stala}:
if (isset($info[\'APP13\'])) {
$iptc = iptcparse($info[\'APP13\']);
var_dump($iptc);
}
Kompletny skrypt wyświetlający dane IPTC z pliku foto.jpg jest zawarty na listingu 2.
$size = getimagesize(\'foto.jpg\', $info);
if (isset($info[\'APP13\'])) {
$iptc = iptcparse($info[\'APP13\']);
var_dump($iptc);
}
Przetwarzanie danych IPTC ułatwia klasa Image_IPTC z biblioteki PEAR (http://pear.php.net/package/Image_IPTC). Korzystając z niej najpierw dołączamy plik IPTC.php, a następnie wywołujemy konstruktor Image_IPTC:
require_once \'IPTC.php\';
$img = new Image_IPTC(\'foto.jpg\');
Otrzymany obiekt {stala}$img{/stala} zawiera metodę {stala}getTag(){/stala}, która pozwala na odczytywanie zarówno skalarnych danych IPTC:
echo $img->getTag(\'copyright_string\');
echo $img->getTag(\'caption\');
jak i danych, które są tablicą wartości:
$i = 0;
$keyword = $img->getTag(\'keywords\', $i);
while ($keyword) {
$i++;
echo $keyword;
$keyword = $img->getTag(\'keywords\', $i);
}
W przypadku tablic (np. wpis keywords danych IPTC) metoda {stala}getTag(){/stala} przyjmuje dodatkowy drugi parametr będący indeksem elementu. Kompletny skrypt odczytujący dane IPTC, bazujący na klasie {stala}Image_IPTC{/stala} jest przedstawiony na listingu 3.
require_once \'IPTC.php\';
$z = new Image_IPTC(\'foto.jpg\');
echo $z->getTag(\'copyright_string\');
echo $z->getTag(\'caption\');
$i = 0;
$keyword = $z->getTag(\'keywords\', $i);
while ($keyword) {
$i++;
echo $keyword\';
$keyword = $z->getTag(\'keywords\', $i);
}
Zapisywanie danych IPTC
Dane IPTC można edytować wykorzystując IrfanView. Okno dialogowe widoczne na rys. 8 pozwala nie tylko przeglądać, ale także edytować wpisy IPTC w pliku. Co ważne, jeżeli plik nie zawierał wpisów IPTC, program IrfanView doda nowo wprowadzone wartości.
Zapisywanie danych IPTC w PHP
Do edycji wpisów IPTC z poziomu PHP można użyć klasy {stala}Image_IPTC{/stala}. Klasa ta zawiera metody {stala}setTag(){/stala} oraz {stala}save(){/stala}. Pierwsza z nich ustala wartość wybranego znacznika, druga zapisuje dane IPTC w pliku graficznym:
$img = new Image_IPTC(\'foto.jpg\');
$img->setTag(\'caption\', \'Lorem ipsum\'
$img->save();
Problemy
Niestety, ani funkcje {stala}exif_read_data(){/stala}, {stala}getimagesize(){/stala}, ani klasa {stala}Image_IPTC{/stala} nie umożliwiają przekazywania obrazów w postaci napisów. Wymagają one nazwy pliku. Utrudnia to znacznie przetwarzanie obrazów zapisanych w bazie danych.
Ponadto klasa {stala}Image_IPTC{/stala} nie umożliwia osadzania danych IPTC w plikach, które takich danych nie zawierają. Wymaga to wstępnego przetworzenia pliku graficznego innym programem (np. IrfanView lub exiv2.exe). Po dodaniu jakiegokolwiek wpisu IPTC przy użyciu IrfanView dane IPTC mogą podlegać modyfikacjom przy użyciu klasy {stala}Image_IPTC{/stala}.
Najwygodniejszą metodą dołączenia identycznych danych IPTC do dużej liczby plików jest użycie programu wsadowego exiv2.exe. Po utworzeniu pliku cmd.txt z komendami:
add Iptc.Application2.Credit String \"Lorem ipsum\"
add Iptc.Application2.Caption String \"Dolor sit\"
add Iptc.Application2.Copyright String \"ABCDE\"
set Iptc.Application2.Credit String \"Lorem ipsum\"
set Iptc.Application2.Caption String \"Dolor sit\"
set Iptc.Application2.Copyright String \"ABCDE\"
i wywołaniu:
exiv2.exe -m cmd.txt fotki/*.jpg
wszystkie pliki o rozszerzeniu .jpg z folderu fotki otrzymają po trzy wpisy IPCT: Credit, Caption oraz Copyright o wartościach Lorem ipsum, Dolor sit oraz ABCDE.