Получить / установить DPI с помощью PHP GD/Imagick?
Я создаю веб-приложение, которое будет обрабатывать файлы изображений, которые в конечном итоге будут напечатаны, в большом формате.
Как часть этого, мне нужно получить (т.е. прочитать) и установить (т.е. изменить) DPI файла изображения.
Это возможно через PHP GD или PHP Imagick?
Спасибо,
BK
Редактировать:
DPI изображения можно получить через iMagick's. getImageResolution
метод:
public function getDPI() {
$imgDPI = $this->image->getImageResolution();
return $imgDPI;
}
и DPI изображения можно установить через iMagick's setImageResolution
метод:
public function setDPI($DPIX, $DPIY) {
$this->image->setImageResolution($DPIX,$DPIY);
}
3 ответа
Чтобы использовать "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"
}
В примитивном растровом формате, подобном тем, которые выводит GD, настройка dpi - это просто метаинформация, которую приложение обработки может использовать для преобразования размера пикселя в физическую единицу.
Насколько я знаю, невозможно манипулировать метаданными непосредственно в GD. Вы должны использовать внешнюю библиотеку для этого.
Тем не менее, я не думаю, что это действительно необходимо. Просто сгенерируйте изображение в нужных вам размерах (количество пикселей - это действительно важная информация!) И сообщите процессу печати, какой параметр dpi использовать.
Это мое рабочее решение на 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;
}