public static function getHumanReadable($field, $data)
{
switch ($field) {
case 'ExposureMode':
switch ($data) {
case 0:
return Horde_Image_Translation::t("Auto exposure");
case 1:
return Horde_Image_Translation::t("Manual exposure");
case 2:
return Horde_Image_Translation::t("Auto bracket");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'ExposureProgram':
switch ($data) {
case 1:
return Horde_Image_Translation::t("Manual");
case 2:
return Horde_Image_Translation::t("Normal Program");
case 3:
return Horde_Image_Translation::t("Aperture Priority");
case 4:
return Horde_Image_Translation::t("Shutter Priority");
case 5:
return Horde_Image_Translation::t("Creative");
case 6:
return Horde_Image_Translation::t("Action");
case 7:
return Horde_Image_Translation::t("Portrait");
case 8:
return Horde_Image_Translation::t("Landscape");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'XResolution':
case 'YResolution':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
return sprintf(Horde_Image_Translation::t("%d dots per unit"), $n);
}
return sprintf(Horde_Image_Translation::t("%d per unit"), $data);
case 'ResolutionUnit':
switch ($data) {
case 1:
return Horde_Image_Translation::t("Pixels");
case 2:
return Horde_Image_Translation::t("Inch");
case 3:
return Horde_Image_Translation::t("Centimeter");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'ExifImageWidth':
case 'ExifImageLength':
return sprintf(Horde_Image_Translation::t("%d pixels"), $data);
case 'Orientation':
switch ($data) {
case 1:
return sprintf(Horde_Image_Translation::t("Normal (O deg)"));
case 2:
return sprintf(Horde_Image_Translation::t("Mirrored"));
case 3:
return sprintf(Horde_Image_Translation::t("Upsidedown"));
case 4:
return sprintf(Horde_Image_Translation::t("Upsidedown Mirrored"));
case 5:
return sprintf(Horde_Image_Translation::t("90 deg CW Mirrored"));
case 6:
return sprintf(Horde_Image_Translation::t("90 deg CCW"));
case 7:
return sprintf(Horde_Image_Translation::t("90 deg CCW Mirrored"));
case 8:
return sprintf(Horde_Image_Translation::t("90 deg CW"));
}
break;
case 'ExposureTime':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($d == 0) {
return;
}
$data = $n / $d;
}
return self::_formatExposure($data);
case 'ShutterSpeedValue':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($d == 0) {
return;
}
$data = $n / $d;
}
$data = exp($data * log(2));
if ($data > 0) {
$data = 1 / $data;
}
return self::_formatExposure($data);
case 'ApertureValue':
case 'MaxApertureValue':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($d == 0) {
return;
}
$data = $n / $d;
$data = exp($data * log(2) / 2);
// Precision is 1 digit.
$data = round($data, 1);
}
return 'f/' . $data;
case 'FocalLength':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($d == 0) {
return;
}
return sprintf(Horde_Image_Translation::t("%d mm"), round($n / $d));
}
return sprintf(Horde_Image_Translation::t("%d mm"), $data);
case 'FNumber':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($d != 0) {
return 'f/' . round($n / $d, 1);
}
}
return 'f/' . $data;
case 'ExposureBiasValue':
if (strpos($data, '/') !== false) {
list($n, $d) = explode('/', $data, 2);
if ($n == 0) {
return '0 EV';
}
}
return $data . ' EV';
case 'MeteringMode':
switch ($data) {
case 0:
return Horde_Image_Translation::t("Unknown");
case 1:
return Horde_Image_Translation::t("Average");
case 2:
return Horde_Image_Translation::t("Center Weighted Average");
case 3:
return Horde_Image_Translation::t("Spot");
case 4:
return Horde_Image_Translation::t("Multi-Spot");
case 5:
return Horde_Image_Translation::t("Multi-Segment");
case 6:
return Horde_Image_Translation::t("Partial");
case 255:
return Horde_Image_Translation::t("Other");
default:
return sprintf(Horde_Image_Translation::t("Unknown: %s"), $data);
}
break;
case 'LightSource':
switch ($data) {
case 1:
return Horde_Image_Translation::t("Daylight");
case 2:
return Horde_Image_Translation::t("Fluorescent");
case 3:
return Horde_Image_Translation::t("Tungsten");
case 4:
return Horde_Image_Translation::t("Flash");
case 9:
return Horde_Image_Translation::t("Fine weather");
case 10:
return Horde_Image_Translation::t("Cloudy weather");
case 11:
return Horde_Image_Translation::t("Shade");
case 12:
return Horde_Image_Translation::t("Daylight fluorescent");
case 13:
return Horde_Image_Translation::t("Day white fluorescent");
case 14:
return Horde_Image_Translation::t("Cool white fluorescent");
case 15:
return Horde_Image_Translation::t("White fluorescent");
case 17:
return Horde_Image_Translation::t("Standard light A");
case 18:
return Horde_Image_Translation::t("Standard light B");
case 19:
return Horde_Image_Translation::t("Standard light C");
case 20:
return 'D55';
case 21:
return 'D65';
case 22:
return 'D75';
case 23:
return 'D50';
case 24:
return Horde_Image_Translation::t("ISO studio tungsten");
case 255:
return Horde_Image_Translation::t("other light source");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'WhiteBalance':
switch ($data) {
case 0:
return Horde_Image_Translation::t("Auto");
case 1:
return Horde_Image_Translation::t("Manual");
default:
Horde_Image_Translation::t("Unknown");
}
break;
case 'FocalLengthIn35mmFilm':
return $data . ' mm';
case 'Flash':
switch ($data) {
case 0:
return Horde_Image_Translation::t("No Flash");
case 1:
return Horde_Image_Translation::t("Flash");
case 5:
return Horde_Image_Translation::t("Flash, strobe return light not detected");
case 7:
return Horde_Image_Translation::t("Flash, strobe return light detected");
case 9:
return Horde_Image_Translation::t("Compulsory Flash");
case 13:
return Horde_Image_Translation::t("Compulsory Flash, Return light not detected");
case 15:
return Horde_Image_Translation::t("Compulsory Flash, Return light detected");
case 16:
return Horde_Image_Translation::t("No Flash");
case 24:
return Horde_Image_Translation::t("No Flash");
case 25:
return Horde_Image_Translation::t("Flash, Auto-Mode");
case 29:
return Horde_Image_Translation::t("Flash, Auto-Mode, Return light not detected");
case 31:
return Horde_Image_Translation::t("Flash, Auto-Mode, Return light detected");
case 32:
return Horde_Image_Translation::t("No Flash");
case 65:
return Horde_Image_Translation::t("Red Eye");
case 69:
return Horde_Image_Translation::t("Red Eye, Return light not detected");
case 71:
return Horde_Image_Translation::t("Red Eye, Return light detected");
case 73:
return Horde_Image_Translation::t("Red Eye, Compulsory Flash");
case 77:
return Horde_Image_Translation::t("Red Eye, Compulsory Flash, Return light not detected");
case 79:
return Horde_Image_Translation::t("Red Eye, Compulsory Flash, Return light detected");
case 89:
return Horde_Image_Translation::t("Red Eye, Auto-Mode");
case 93:
return Horde_Image_Translation::t("Red Eye, Auto-Mode, Return light not detected");
case 95:
return Horde_Image_Translation::t("Red Eye, Auto-Mode, Return light detected");
}
break;
case 'FileSize':
if ($data <= 0) {
return '0 Bytes';
}
$s = array('B', 'kB', 'MB', 'GB');
$e = floor(log($data, 1024));
return round($data / pow(1024, $e), 2) . ' ' . $s[$e];
case 'SensingMethod':
switch ($data) {
case 1:
return Horde_Image_Translation::t("Not defined");
case 2:
return Horde_Image_Translation::t("One Chip Color Area Sensor");
case 3:
return Horde_Image_Translation::t("Two Chip Color Area Sensor");
case 4:
return Horde_Image_Translation::t("Three Chip Color Area Sensor");
case 5:
return Horde_Image_Translation::t("Color Sequential Area Sensor");
case 7:
return Horde_Image_Translation::t("Trilinear Sensor");
case 8:
return Horde_Image_Translation::t("Color Sequential Linear Sensor");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'ColorSpace':
switch ($data) {
case 1:
return Horde_Image_Translation::t("sRGB");
default:
return Horde_Image_Translation::t("Uncalibrated");
}
case 'SceneCaptureType':
switch ($data) {
case 0:
return Horde_Image_Translation::t("Standard");
case 1:
return Horde_Image_Translation::t("Landscape");
case 2:
return Horde_Image_Translation::t("Portrait");
case 3:
return Horde_Image_Translation::t("Night Scene");
default:
return Horde_Image_Translation::t("Unknown");
}
case 'DateTime':
case 'DateTimeOriginal':
case 'DateTimeDigitized':
return date('m/d/Y H:i:s O', $data);
case 'UserComment':
//@TODO: the first 8 bytes of this field contain the charset used
// to encode the comment. Either ASCII, JIS, UNICODE, or
// UNDEFINED. Should probably either convert to a known charset
// here and let the calling code deal with it, or allow this
// method to take an optional charset to convert to (would
// introduce a dependency on Horde_String to do the conversion).
$data = trim(substr($data, 7));
default:
return !empty($data) ? $data : '---';
}
}