У меня есть проект, в котором у меня есть система «горячих папок», в которую я помещаю файл в папку, и он выполняет сценарий PHP, который делает магию над файлом с помощью ImageMagick.
Одна из операций, которую я хочу выполнить с ImageMagick, — это простой процесс изменения разрешения изображения.
Я хочу получить изображение с разрешением 72 DPI. Это часть моего кода:
$im = new Imagick();
$im->setResolution(72,72);
$im->readimage($xmlConfig->general->input); //Input is TIF 300 DPI
$im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
$im->setImageResolution(72,72);
$im->resampleImage(72,72,imagick::FILTER_UNDEFINED,0);
$im->setimageformat($xmlConfig->extension); //added in EDIT
$im->writeimage($xmlConfig->general->output); //Output is also 300 DPI Filename is something.jpg added in EDIT
$im->destroy();
Итак, что я делаю не так? Потому что я не могу заставить это работать. Я перепробовал все доступные комбинации, чтобы попытаться сделать это правильно, а также погуглил это как маньяк и все еще не получил желаемый результат.
** Редактировать: * Я заметил, когда я провел некоторое тестирование, что это действительно работает. Но это когда я добавляю часть с setimageformat
в JPEG и установите имя файла в something.jpg что это идет не так.
JPEG всегда 300 DPI, даже если я указал 72 выше.
Я обнаружил, что мне нужно сделать это, чтобы удалить любой профиль, прикрепленный к файлу, чтобы иметь возможность вносить изменения в изображение.
$im->stripimage();
Обновленный ответ
Я сделал следующее:
# Create a TIF with density 300 and undefined units
convert -size 1000x1000 -density 300 xc:red input.tif
# Check what got created
identify -verbose input.tif | egrep -i "units|resol"Resolution: 300x300
Units: Undefined
Запустил ваш код, модифицированный следующим образом:
#!/usr/local/bin/php
<?php
$im = new Imagick();
$im->setResolution(72,72);
$im->readimage('input.tif'); //Input is TIF 300 DPI
$im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
$im->setImageResolution(72,72);
$im->resampleImage(72,72,imagick::FILTER_UNDEFINED,0);
$im->setimageformat('jpeg');
$im->writeimage("output.jpg");
$im->destroy();
?>
Затем проверил и получил это:
identify -verbose output.jpg | egrep -i "units|resol"Resolution: 72x72
Units: PixelsPerInch
Оригинальный ответ
Мой ответ таков: ваш ImageMagick, вероятно, является устаревшей версией, и вы должны обновить ее. Я основываю это на следующем:
# Create a TIF with density 300 and undefined units
convert -size 1000x1000 -density 300 xc:red input.tif
# Check what got created
identify -verbose input.tif | egrep -i "units|resol"Resolution: 300x300
Units: Undefined
# Run your script
./go.php
# Check results
identify -verbose output.tif | egrep -i "units|resol"Resolution: 72x72
Units: PixelsPerInch
Моя версия выглядит следующим образом:
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-10-26 http://www.imagemagick.org