From - darkain at darkain dot com 's example.
If all the data is from the same image - simply
<?php
$exif_data = exif_read_data ( $_FILES['photo']
$emake =$exif_data['Make'];
$emodel = $exif_data['Model'];
$eexposuretime = $exif_data['ExposureTime'];
$efnumber = $exif_data['FNumber'];
$eiso = $exif_data['ISOSpeedRatings'];
$edate = $exif_data['DateTime'];
?>
will work, I tried using the PEL library, and while pretty cool, I can't for the life understand how to call some things, this is simpler if your system is pretty basic or if you're in a rush. If you have time, try playing with PEL. It's not maintained at the moment though..
http://pel.sourceforge.net/
exif_read_data
(PHP 4 >= 4.2.0, PHP 5)
exif_read_data — Lee las cabeceras EXIF desde un JPEG o un TIFF
Descripción
exif_read_data() lee las cabeceras EXIF desde un archivo de imagen JPEG o TIFF. De esta forma se puede leer los meta-datos generados por cámaras digitales.
Las cabeceras EXIF tienden a estar presentes en imágenes JPEG/TIFF generadas por cámaras digitales, pero desafortunadamente cada fabricante de cámaras digitales tiene una idea diferente de cómo etiquetar sus imágenes, por lo que no siempre se puede contar con que una cabecera Exif específica esté presente.
Height y Width son computados de la misma forma que lo hace getimagesize() por lo que sus valores no deben ser parte de ninguna cabecera devuelta. También, html es una cadena de texto de alto/ancho para usar dentro de un HTML normal.
Cuando una cabecera Exif contiene una nota de Copyright, puede contener ella misma dos valores. Como la solución es inconsistente en el estándar Exif 2.10, la sección COMPUTED devolverá las dos entradas Copyright.Photographer y Copyright.Editor mientras que las secciones IFD0 contienen la matriz de bytes con el carácter NULL que divide ambas entradas. O sólo la primera entrada si el tipo de información era erróneo (el comportamiento normal de Exif). COMPUTED también contendrá la entrada Copyright que es la cadena del copyright original, o una lista separada por comas del copyright de la fotografía y del editor.
La etiqueta UserComment tiene el mismo problema que la etiqueta Copyright. Puede almacenar dos valores. El primero es el que usa la codificación, y el segundo es el valor mismo. Por lo que si la sección IFD sólo contiene la codificación o una matriz de bytes, la sección COMPUTED almacenará la dos entradas UserCommentEncoding y UserComment. La entrada UserComment está disponible en ambos casos por lo que se debería usar con preferencia al valor de la sección IFD0.
exif_read_data() también valida las etiquetas de información EXIF según la especifiación EXIF (» http://exif.org/Exif2-2.PDF, página 20).
Note:
Windows Me/XP pueden borrar las cabeceras Exif cuando se conecta una cámara.
Parámetros
- filename
-
El nombre de la imagen que se va a leer. No puede ser una URL.
- sections
-
Es una lista separada por comas de las secciones que necesitan estar presentes en el archivo para producir un array resultante. Si no se puede encontrar ninguna sección el valor devuelto es FALSE.
FILE FileName, FileSize, FileDateTime, SectionsFound COMPUTED html, Width, Height, IsColor, y más si están disponibles. Height y Width son computados de la misma forma que lo hace getimagesize() por lo que sus valores no deben ser parte de ninguna cabecera devuelta. También, html es una cadena de texto de alto/ancho para usar dentro de un HTML normal. ANY_TAG Cualquier información que tenga una Etiqueta, p.ej., IFD0, EXIF, ... IFD0 Toda la información etiquetada de IFD0. En archivos de imagen normales, ésto contiene el tamaño de la imagen y así sucesivamente. THUMBNAIL Se supone que un archivo contiene una miniatura si tiene un segundo IFD. Toda la información etiquetada acerca de la miniatura embebida es almacenada en esta sección. COMMENT Cabeceras de comentarios de imágenes JPEG. EXIF La sección EXIF es una subsección de IFD0. Contiene información más detallada sobre la imagen. La mayoría de estas entradas están relacionadas con la cámara digital. - arrays
-
Especifica si cada sección se convierte o no en una matriz. sections COMPUTED, THUMBNAIL, y COMMENT siempre se convierten en matrices ya que pueden contener valores cuyos nombres entran en conflicto con otras secciones.
- thumbnail
-
Cuando se establece a TRUE se lee la miniatura misma. Si no, sólo se lee la información etiquetada.
Valores devueltos
Devuelve un array asociativo donde los índices de la matriz son los nombres de las cabeceras y los valores de la matriz son los valores asociados con esas cabeceras. Si no se puede devolver información, exif_read_data() devolverá FALSE.
Historial de cambios
| Versión | Descripción |
|---|---|
| 4.3.0 | Se puede leer toda la información IFD embebida incluidas matrices (devueltas como tales). También, el tamaño de una miniatura embebida es devuelto en una submatriz THUMBNAIL, y puede devolver miniaturas en formato TIFF. Además, ya no hay una longitud máxima para los valores devueltos (no mientras el límite de memoria haya sido alcanzado) |
| 4.3.0 | Si PHP tiene soporte para mbstring, el comentario de usuario puede cambiar automáticamente de codificación. También, si el comentario de usuario utiliza la codificación Unicode o JIS, esta codificación será cambiada automáticamente según la configuración inicial de exif en php.ini |
| 4.3.0 | Si la imagen contiene cualquier información IFD0, entonces COMPUTED contiene la entrada ByteOrderMotorola la cuál es 0 para el orden de byte little-endian (intel) y 1 para el orden de byte big-endian (motorola). También, COMPUTED y UserComment ya no contienen la primera entrada de copyright si el tipo de información era erróneo. |
Ejemplos
Example #1 Ejemplo de exif_read_data()
<?php
echo "prueba1.jpg:<br />\n";
$exif = exif_read_data('pruebas/prueba1.jpg', 'IFD0');
echo $exif===false ? "No se encontró información de cabecera.<br />\n" : "La imagen contiene cabeceras<br />\n";
$exif = exif_read_data('pruebas/prueba2.jpg', 0, true);
echo "prueba2.jpg:<br />\n";
foreach ($exif as $clave => $sección) {
foreach ($sección as $nombre => $valor) {
echo "$clave.$nombre: $valor<br />\n";
}
}
?>
La primera llamada falla ya que la imagen no tiene información de cabecera.
El resultado del ejemplo sería algo similar a:
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
Ver también
- exif_thumbnail() - Recuperar la miniatura embebida de una imagen TIFF o JPEG
- getimagesize() - Obtiene el tamaño de una imagen
Get some EXIFs fields (easy way):
<?php
$exif_make = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
$emake = $exif_make['Make'];
$exif_model = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
$emodel = $exif_model['Model'];
$exif_exposuretime = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
$eexposuretime = $exif_exposuretime['ExposureTime'];
$exif_fnumber = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
$efnumber = $exif_fnumber['FNumber'];
$exif_iso = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
$eiso = $exif_iso['ISOSpeedRatings'];
$exif_date = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
$edate = $exif_date['DateTime'];
?>
I wanted some quick and easy functions for computing the shutter speed and f-stop. I couldn't find any anywhere, so I made some. It took some research :
<?php
function exif_get_float($value) {
$pos = strpos($value, '/');
if ($pos === false) return (float) $value;
$a = (float) substr($value, 0, $pos);
$b = (float) substr($value, $pos+1);
return ($b == 0) ? ($a) : ($a / $b);
}
function exif_get_shutter(&$exif) {
if (!isset($exif['ShutterSpeedValue'])) return false;
$apex = exif_get_float($exif['ShutterSpeedValue']);
$shutter = pow(2, -$apex);
if ($shutter == 0) return false;
if ($shutter >= 1) return round($shutter) . 's';
return '1/' . round(1 / $shutter) . 's';
}
function exif_get_fstop(&$exif) {
if (!isset($exif['ApertureValue'])) return false;
$apex = exif_get_float($exif['ApertureValue']);
$fstop = pow(2, $apex/2);
if ($fstop == 0) return false;
return 'f/' . round($fstop,1);
}
?>
Using the exif methods to read WINXP data returns unexpected results unless both exif and mbstring are compiled statically. Please reference the following bug reports:
Bug #31980
Bug #23105
Specifically, the last comment on #23105:
"[8 Apr 2003 4:26pm UTC] edink@php.net
This cannot be fixed due to the fact that mbstring has been removed from PHP core (it has been 'unbundled') and the rest of core files and other extensions cannot use mbstring functionality when it is compiled as a shared library (dll).
"
If exif is compiled statically (--enable-exif) and mbstring compiled as a DSO module (--enable-mbstring=shared) then exif_read_data may only return a single character rather than the entire string.
Compiling both exif and mbstring statically (--enable-exif --enable-mbstring) resolves the issue.
some cameras (most higher models) have position senzor (gyroskope?) and taking-position is wrote in EXIF, here is simple script for automatic rotating images
<?php
$exif = exif_read_data($filename);
$ort = $exif['IFD0']['Orientation'];
switch($ort)
{
case 1: // nothing
break;
case 2: // horizontal flip
$image->flipImage($public,1);
break;
case 3: // 180 rotate left
$image->rotateImage($public,180);
break;
case 4: // vertical flip
$image->flipImage($public,2);
break;
case 5: // vertical flip + 90 rotate right
$image->flipImage($public, 2);
$image->rotateImage($public, -90);
break;
case 6: // 90 rotate right
$image->rotateImage($public, -90);
break;
case 7: // horizontal flip + 90 rotate right
$image->flipImage($public,1);
$image->rotateImage($public, -90);
break;
case 8: // 90 rotate left
$image->rotateImage($public, 90);
break;
}
?>
$image->rotateImage() is inspired by example of http://php.net/manual/en/function.imagerotate.php
$image->flipImage() is inspired by http://php.net/manual/en/function.imagecopy.php#42803 (thank you)
When reading EXIF information from the 'WINXP' group, you may need to change used encoding from the default "ISO-8859-15" to "UTF-8". This can be done in php.ini or in your code:
<?php
ini_set('exif.encode_unicode', 'UTF-8');
$exif = exif_read_data('TEST.JPG', 0, true);
echo $exif['WINXP']['Title'];
?>
Useful documentation about EXIF:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
See also comments next to XPTitle and XPAuthor.
I've just released the "PHP JPEG Metadata Toolkit" which allows reading, writing and displaying of EXIF information, and does not need the --enable-exif option in PHP4.
It has been tested on 466 different models of digital cameras!
It can decode the following EXIF makernotes:
Agfa, Canon, Casio, Contax, Epson, Fujifilm, Konica, Minolta, Kyocera, Nikon, Olympus, Panasonic, Pentax (Asahi), Ricoh and Sony
Additionaly it can decode IPTC, XMP, Photoshop IRB and many other types of JPEG metadata
Try it out, and download it at:
http://www.ozhiker.com/electronics/pjmt/index.html
I've written a library in pure PHP5 for editing EXIF tags. It deals with both reading and writing EXIF tags, and can be downloaded from http://pel.sourceforge.net/
Exif is very unstable under php4.1.2
If you have some problem, (the function didnt return anything, like a blocking call) try this:
$file = './image.jpg';
getimagesize ( $file , $info);
$exif = array();
if (isset($info)) {
foreach($info as $key => $val) {
if ($key != 'APP1') { $exif = read_exif_data($file); break; }
}
}
-- Sharp
For reading EXIF from XMP data embedded by Adobe Photoshop CS, see http://www.photography-on-the.net/ee/beta/cs_xmp_to_exif.php
