Существует два места, в которых может быть сохранено разрешение (то есть разрешение JPEG при печати, также обозначаемое сокращенно как DPI или точки на дюйм).
Первый находится в заголовке JPEG JFIF, который часто (но не всегда) находится в самом начале JPEG.
Другой находится в данных EXIF.
Обратите внимание, что данные разрешения обычно НЕ присутствуют, так как они имеют значение, только если они связаны с физическим размером вывода. Например. если цифровая камера записывает значение, оно обычно не имеет смысла. Однако, когда JPEG выводится на принтер (например), значение будет иметь значение.
Вот некоторый код для его получения из заголовка JFIF, при условии, что он присутствует и находится внутри фрагмента APP0, который является вторым фрагментом в файле. (Первый блок всегда является маркером SOI.):
function read_JFIF_dpi($filename)
{
$dpi = 0;
$fp = @fopen($filename, r);
if ($fp) {
if (fseek($fp, 6) == 0) { // JFIF often (but not always) starts at offset 6.
if (($bytes = fread($fp, 16)) !== false) { // JFIF header is 16 bytes.
if (substr($bytes, 0, 4) == "JFIF") { // Make sure it is JFIF header.
$JFIF_density_unit = ord($bytes[7]);
$JFIF_X_density = ord($bytes[8])*256 + ord($bytes[9]); // Read big-endian unsigned short int.
$JFIF_Y_density = ord($bytes[10])*256 + ord($bytes[11]); // Read big-endian unsigned short int.
if ($JFIF_X_density == $JFIF_Y_density) { // Assuming we're only interested in JPEGs with square pixels.
if ($JFIF_density_unit == 1) $dpi = $JFIF_X_density; // Inches.
else if ($JFIF_density_unit == 2) $dpi = $JFIF_X_density * 2.54; // Centimeters.
}
}
}
}
fclose($fp);
}
return ($dpi);
}