Я создаю веб-приложение, которое будет обрабатывать файлы изображений, которые в конечном итоге будут напечатаны в большом формате.
Как часть этого, мне нужно получить (т.е. прочитать) и установить (то есть изменить) DPI файла изображения.
Возможно ли это через PHP GD или PHP Imagick?
Благодаря,
BK
Доступ к DPI изображения можно получить с помощью метода getImageResolution
iMagick:
public function getDPI() { $imgDPI = $this->image->getImageResolution(); return $imgDPI; }
и DPI изображения можно установить с помощью метода setImageResolution
:
public function setDPI($DPIX, $DPIY) { $this->image->setImageResolution($DPIX,$DPIY); }
В примитивном формате растрового изображения, подобном тем, что GD выдает, параметр dpi – это просто метаинформация, которую приложение обработки может использовать для преобразования размера пикселя в физическую единицу.
Насколько я знаю, невозможно управлять метаданными непосредственно в GD. Для этого вам придется использовать внешнюю библиотеку.
Тем не менее, я не думаю, что это действительно необходимо. Просто сгенерируйте изображение в любых требуемых размерах пикселей (количество пикселей – это действительно релевантная информация!) И сообщите процессу печати, какие параметры dpi будут использоваться.
для использования «getImageResolution ()»; вы должны быть уверены, что разрешение в «PixelsPerInch» … иногда это может быть «PixelsPerCentimeter»
используйте следующий код для получения информации об изображении:
$imagick = new Imagick($filename); $data = $imagick->identifyimage(); var_dump($data);
результат (когда PixelsPerInch):
array(11) { ["imageName"]=> string(11) "/jpg300.jpg" ["format"]=> string(51) "JPEG (Joint Photographic Experts Group JFIF format)" ["units"]=> string(13) "PixelsPerInch" ["type"]=> string(9) "TrueColor" ["colorSpace"]=> string(3) "RGB" ["compression"] => string(4) "JPEG" ["fileSize"] => string(6) "8.72mb" ["mimetype"] => string(10) "image/jpeg" ["geometry"] => array(2) { ["width"] => int(11812) ["height"] => int(7876) } ["resolution"]=> array(2) { ["x"]=> float(300) ["y"]=> float(300) } ["signature"]=> string(64) "7fc387ea465ec716e9fd6e233bb1d3740cb509f5667ed2a4df0199e6e664590e" }
или (когда PixelsPerCentimeter):
array(11) { ["imageName"]=> string(8) "/psm.jpg" ["format"]=> string(51) "JPEG (Joint Photographic Experts Group JFIF format)" ["units"]=> string(19) "PixelsPerCentimeter" ["type"]=> string(9) "TrueColor" ["colorSpace"]=> string(3) "RGB" ["compression"]=> string(4) "JPEG" ["fileSize"]=> string(7) "25.01mb" ["mimetype"]=> string(10) "image/jpeg" ["geometry"]=> array(2) { ["width"]=> int(11812) ["height"]=> int(7876) } ["resolution"]=> array(2) { ["x"]=> float(118.11) ["y"]=> float(118.11) } ["signature"]=> string(64) "b491e059624e79a4dee62d9cc7646019927b2222bfed9ac8dd4342185e648eaf" }
Это мое решение для работы на Joox.io
/** * @param $filename * @return array */ function getImageDPI($filename) { $resolutions = null; if (class_exists('Imagick')) { $image = new Imagick($filename); $resolutions = $image->getImageResolution(); } else { $a = fopen($filename, 'r'); $string = fread($a, 20); fclose($a); $data = bin2hex(substr($string, 14, 4)); $x = substr($data, 0, 4); $y = substr($data, 4, 4); $resolutions = array('x' => hexdec($x), 'y' => hexdec($y)); } return $resolutions; }