Генерация миниатюр Imagemagick с помощью php – с использованием -crop
-
16-09-2019 - |
Вопрос
Давным-давно я создал небольшую библиотеку для изменения размера изображений с помощью imagemagick через system(...)
потому что я не чувствовал, что встроенных функций imagemagick для PHP достаточно.
Однако недавно мне пришлось портировать это в проект Symfony, и я решил использовать sfThumbnailPlugin (если я правильно помню).К сожалению, это не включало функцию обрезки, т.е.чтобы указать желаемый размер, например.300x300 пикселей и обрежьте миниатюру по размеру.Я решил реализовать эту функциональность самостоятельно, но, похоже, что-то не так.
Всякий раз, когда я изменяю размер изображения до желаемого размера, если ширина больше высоты, пропорции нарушаются.Взгляните на этот пример: http://i37.tinypic.com/9hkqrl.png - В этом примере верхний ряд — правильные пропорции, а нижний ряд — проблема.
В примере верх и низ должны были быть обрезаны.
Вот код той части, где выполняется обрезка (имена переменных не требуют пояснений):
<?php
if ($width/$height > $this->maxWidth/$this->maxHeight) {
// then resize to the new height...
$command .= ' -resize "x'.$this->maxWidth.'"';
// ... and get the middle part of the new image
// what is the resized width?
$resized_w = ($this->maxWidth/$height) * $width;
// crop
$command .= ' -crop "'.$this->maxHeight.'x'.$this->maxWidth.'+'.round(($resized_w - $this->maxWidth)/2).'+0"';
} else {
// or else resize to the new width
$command .= ' -resize "'.$this->maxHeight.'x"';
// ... and get the middle part of the new image
// what is the resized height?
$resized_h = ($this->maxHeight/$width) * $height;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
'+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
}
Is — это вторая часть оператора if, которая создает неверный код.
Может ли кто-нибудь исправить это для меня?Очевидно, что расчеты неверны.
Решение
Решение было следующим:
if ($width/$height > $this->maxWidth/$this->maxHeight) {
// then resize to the new height...
$command .= ' -resize "x'.$this->maxHeight.'"';
// ... and get the middle part of the new image
// what is the resized width?
$resized_w = ($this->maxHeight/$height) * $width;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.'+'.round(($resized_w - $this->maxWidth)/2).'+0" +repage';
} else {
$command .= ' -resize "' . $this->maxWidth . 'x"';
$resized_h = ($this->maxWidth/$width) * $height;
// crop
$command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
'+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
}
Другие советы
Я предлагаю одно предложение, которое вы можете попробовать,
Я видел ссылку на изображение. Думаю, условия проверены неправильно.
вы проверили состояние [(ширина/высота) > (maxWidth/maxHeight)] Вместо проверки
if (width == height) {} elseif (ширина> высота) {} else (width <height) {}
Проверьте это условие и согласно этому условию обрежьте изображение и измените его размер.
Спасибо