Генерация миниатюр Imagemagick с помощью php – с использованием -crop

StackOverflow https://stackoverflow.com/questions/1679092

Вопрос

Давным-давно я создал небольшую библиотеку для изменения размера изображений с помощью 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) {}

Проверьте это условие и согласно этому условию обрежьте изображение и измените его размер.

Спасибо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top