Найти разрешение JPEG с помощью PHP

Вызов всех гуру PHP!

Я понимаю, что вы можете использовать getimagesize (), чтобы получить фактическую высоту и ширину пикселя изображения в PHP. Однако, если вы открываете изображение в фотошопе и смотрите диалоговое окно размера изображения, вы заметите, что есть значение разрешения, определяющее размер печати изображения.

Учитывая произвольный файл изображения jpg, мне нужно использовать PHP для определения этого номера разрешения. Похоже, что эта информация хранится в файле jpg где-то, и как мне добраться до нее?

Еще одно требование – у меня есть только gdlib. Мне нужно сделать это без использования других php-библиотек (imagemagick и т. Д.),

Спасибо за помощь!

Related of "Найти разрешение JPEG с помощью PHP"

Вы можете просто прочитать файл JPEG напрямую, в байтах 14-18 указать:

  • байт 14: 01, X и Y спецификатор единицы плотности (00: нет, соотношение пикселей, 01: DPI, 02: DPC)
  • байты 15-16: плотность горизонтальных пикселей,
  • байт 16-18: вертикальный пиксельный денсит

Также см .: http://www.obrador.com/essentialjpeg/headerinfo.htm

Есть два места, где может быть сохранено разрешение (например, разрешение JPEG при печати, также упоминаемое в сокращенном виде как DPI или точки на дюйм).

Первый – в заголовке JFIF JPEG, который часто (но НЕ всегда) находится прямо в начале 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); } 

РЕШЕНИЕ: Пользовательский набор метаданных PHP JPEG – загружен отсюда: http://www.ozhiker.com/electronics/pjmt/

В этом наборе инструментов есть несколько удобных скриптов, которые будут делать всевозможные вещи, включая просмотр и редактирование заголовка, метаданных и jfif-информации в файле jpeg. Вот сценарий, который дает вам XDensity и YDensity (разрешение печати x и y) jpg:

 <?php include_once("./JPEG.php"); include_once("./JFIF.php"); $image_header = get_jpeg_header_data("./myImage.jpg"); $image_info = get_JFIF($image_header); print( "XDensity:" . $image_info['XDensity'] . "<br />"); print( "YDensity:" . $image_info['YDensity'] . "<br />"); ?> 

Я этого не понимаю. Pixels = printsize x resolution, а количество пикселей – заданное значение. Итак, если у вас есть изображение размером 300×300 пикселей, у вас есть 1 "x1" с разрешением 300 DPI, 2 "x2" с разрешением 150 DPI или 4 "x4" с разрешением 75 DPI и т. Д. Изображение не имеет разрешения если он не имеет физического размера, чтобы сравнить его размер пикселя.

Что мне не хватает? (и насколько это очевидно для всех остальных? =])

В зависимости от того, как изображение сохраняется, EXIF ​​содержит метрическую нагрузку на информацию. Подробнее об этом читайте в руководстве по PHP . Возможно, вам придется немного анализировать / обрабатывать результаты (например, информация о вспышке или, по крайней мере, была просто байтом, выражающим различные состояния).