I recently needed to determine the DPI of a set of PNG files (so that I could convert the size to points), with the exception of imagemagick there is no way to do this.
So here is a pure-php method of extracting the DPI from a PNG file, it searches for the pHYs chunk (which may or may not exist).
function read_png_dpi($source) { $fh = fopen($source, 'rb'); if (!$fh) return false; $dpi = false; $buf = array(); $x = 0; $y = 0; $units = 0; while(!feof($fh)) { array_push($buf, ord(fread($fh, 1))); if (count($buf) > 13) array_shift($buf); if (count($buf) < 13) continue; if ($buf[0] == ord('p') && $buf[1] == ord('H') && $buf[2] == ord('Y') && $buf[3] == ord('s')) { $x = ($buf[4] << 24) + ($buf[5] << 16) + ($buf[6] << 8) + $buf[7]; $y = ($buf[8] << 24) + ($buf[9] << 16) + ($buf[10] << 8) + $buf[11]; $units = $buf[12]; break; } } fclose($fh); if ($x == $y) $dpi = $x; if ($dpi != false && $units == 1) //meters $dpi = round($dpi * 0.0254); return $dpi; }