При попытке загрузить каждое изображение, которое я считаю большим для своего сайта, я пытаюсь выгрузить изображение, поэтому, когда пользователь пытается загрузить изображение, я сначала проверяю, имеет ли оно приемлемое разрешение, в противном случае я хочу отбросить это разрешение. Код, который я использую для этого:
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, но я не могу этого сделать!
«Разрешение» в функциях setImageResolution и getImageResolution относится к настройке изображения в точках на дюйм, что является подсказкой для принтеров, какого размера печатать изображение, т. Е. Сколько точек на дюйм должно быть напечатано.
Он не влияет на размеры изображения в пикселях и, следовательно, не оказывает заметного влияния на изображение на компьютере, который не использует настройку DPI для рендеринга изображения.
Вы хотите использовать либо просто $imagick->getImageWidth()
а также $imagick->getImageHeight()
или же $imagick->getImageGeometry()
чтобы получить размер изображения в пикселях, а затем повторно сэмплировать его, исходя из этих размеров в пикселях, а не из настроек подсказки принтера.
Похоже, что значения разрешения должны быть одинаковыми как в setImageResolution, так и в resampleImage. Вы уже пробовали это?
$imagick->setImageResolution($resolution_x/2,$resolution_x/2);