Найти разрешение JPEG с помощью PHP - PullRequest
4 голосов
/ 04 ноября 2008

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

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 04 ноября 2008

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

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

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

5 голосов
/ 05 сентября 2011

Существует два места, в которых может быть сохранено разрешение (то есть разрешение 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);
}
3 голосов
/ 04 ноября 2008

РЕШЕНИЕ: Пользовательский инструментарий метаданных 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 />");

?>
1 голос
/ 04 ноября 2008

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

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

0 голосов
/ 04 ноября 2008

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

...