有两个地方可以潜在地存储分辨率(即打印时 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);
}