解像度 (つまり、印刷時の JPEG の解像度。省略して DPI または 1 インチあたりのドット数とも呼ばれます) を保存できる可能性のある場所が 2 つあります。
1 つ目は JPEG の JFIF ヘッダーにあり、多くの場合 (常にではありません) JPEG の先頭にあります。
もう 1 つは EXIF データにあります。
物理的な出力サイズに関連付けられている場合にのみ意味があるため、解像度データは通常存在しないことに注意してください。たとえば、デジタル カメラが値を書き込む場合、通常は意味がありません。ただし、JPEG がプリンタに出力されている場合 (たとえば)、値には意味があります。
JFIF ヘッダーからそれを取得するためのコードを次に示します。ただし、ヘッダーが存在し、ファイルの 2 番目のチャンクである 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);
}