PHP Imagick :: resampleImage изменяет размер изображения вместо пересэмплирования

При попытке загрузить каждое изображение, которое я считаю большим для своего сайта, я пытаюсь выгрузить изображение, поэтому, когда пользователь пытается загрузить изображение, я сначала проверяю, имеет ли оно приемлемое разрешение, в противном случае я хочу отбросить это разрешение. Код, который я использую для этого:

if ($image->isValid()){
$imagick = new \Imagick();
$imagick->readImage($image);
$resolution = $imagick->getImageResolution();
$resolution_x = $resolution['x'];
$resolution_y = $resolution['y'];
if ($resolution_x > 30 && $resolution_y > 30){
$imagick->setImageResolution($resolution_x,$resolution_x);
$imagick->resampleImage($resolution_x/2,$resolution_x/2,\imagick::FILTER_CATROM,1);
}
$imagick->writeImage($uploadDir.$path);
}

Этот код должен был установить разрешение изображения с разрешением 300 точек на дюйм, например, 150 точек на дюйм. Вместо этого разрешение остается 300 точек на дюйм, а размеры изображения уменьшаются до половины их предыдущих значений (например, изображение (1200×800) превращается в (600×400)). Я что-то упускаю из-за функциональности Imagick :: resampleImage или в моем коде есть ошибки? Я провел много поисков, прежде чем опубликовать этот вопрос, и попробовал много разных способов добиться своей цели с помощью Imagick, но я не могу этого сделать!

1

Решение

«Разрешение» в функциях setImageResolution и getImageResolution относится к настройке изображения в точках на дюйм, что является подсказкой для принтеров, какого размера печатать изображение, т. Е. Сколько точек на дюйм должно быть напечатано.

Он не влияет на размеры изображения в пикселях и, следовательно, не оказывает заметного влияния на изображение на компьютере, который не использует настройку DPI для рендеринга изображения.

Вы хотите использовать либо просто $imagick->getImageWidth() а также $imagick->getImageHeight() или же $imagick->getImageGeometry() чтобы получить размер изображения в пикселях, а затем повторно сэмплировать его, исходя из этих размеров в пикселях, а не из настроек подсказки принтера.

0

Другие решения

Похоже, что значения разрешения должны быть одинаковыми как в setImageResolution, так и в resampleImage. Вы уже пробовали это?

$imagick->setImageResolution($resolution_x/2,$resolution_x/2);
0

По вопросам рекламы [email protected]