Команда Imagemagick Crop не дает идеального результата

Я использую imagemagick для изменения размера и обрезки изображения.

Тестовое изображение:

введите описание изображения здесь

Мне нужно изменить размер его на 300 x 320 кадров для этого, сначала я изменяю размер изображения, а затем обрезаю его, и я использую следующие команды:

exec("convert /uploadImagePath -thumbnail 300 /newImagePath"); exec("convert /newImagePath -gravity Center -crop 290x310+0+0 /newImagePath"); 

Но это дает мне следующее изображение

введите описание изображения здесь

Как вы видите, изображение не завершено … пожалуйста, помогите мне, где я ошибаюсь

Пытаться:

 $inputFile = "WPTgp.jpg"; exec("convert {$inputFile} -resize 290x310^ -gravity Center -crop 290x310+0+0 picCropped.png"); 

надеюсь, это поможет

(Ответ обновлен, и теперь показан ниже пример -liquid-rescale )


Размеры вашего оригинального изображения:

 489 x 640 pixels 

Ваши желаемые размеры выглядят так:

 290 x 310 pixels 

Это не может масштабироваться до этих размеров без:

  1. обрезка (не сохраняйте все области внутреннего изображения)
  2. сохраняя желаемую ширину (откажитесь от желаемой высоты)
  3. сохраняя желаемую высоту (оставляйте желаемую ширину)
  4. искажения (не сохраняйте соотношение сторон при масштабировании)
  5. padding (добавить несколько пикселей к одному или нескольким краям)
  6. удаление пикселей там, где это не очевидно («жидкостная масштабировка» или «резьба по швам» – см. Википедию )

Ваш результат показывает «1». (обрезка), что вам не нравится. Итак, у вас есть опции «2.» (удерживая ширину), '3.' (высота хранения), '4.' (искажение), '5.' (отступы) и «6.» (резьба по швам), оставленной для проверки.

'2.': Сохранение желаемой высоты

 convert WPTgp.jpg -resize x310 keep-height.jpg 

Результирующее изображение имеет размеры 237 x 310 pixels .
Keep Height.... Держите высоту
(автоматически определите ширину)

'3.': сохранение желаемой ширины

 convert WPTgp.jpg -resize 290x keep-width.jpg 

Результирующее изображение имеет размеры 290 x 380 pixels .
Keep Width..... Сохранить ширину
(автоматически определить высоту)

'4.': Искажение

 convert WPTgp.jpg -resize 290x310\! distorted.jpg 

Результирующее изображение имеет размеры 290 x 310 pixels .
Distorted...... искаженный
(игнорировать соотношение сторон – исказить изображение, если требуется, чтобы соответствовать размерам)

'5.': Прокладка

 convert WPTgp.jpg \ -resize 290x310 \ -gravity center \ -background orange \ -extent 290x310 \ padded.jpg 

Результирующее изображение имеет размеры 290 x 310 pixels . (Оранжевый фон был добавлен только для того, чтобы продемонстрировать, что «расширение» изображения работает.)
Padded......... подбитый
(сохранить пропорции – увеличить изображение для желаемых размеров)

«6.»: Резьба по швам

 convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg 

Выше была бы команда, которую вы спонтанно проистекаете из быстрого считывания ссылки параметров команды ImageMagick. Однако это не сработает, и вместо этого я использовал:

 convert WPTgp.jpg -liquid-rescale 599x640\! -scale 290x310 liquid.jpg convert WPTgp.jpg -liquid-rescale 599x640\! -scale 48.4% liquid.jpg 

Далее ниже объясняется, почему мне нужно было его изменить ….
Liquid-rescaled «Жидко» изменено
Извините – я не могу представить примерное изображение прямо сейчас; для этого требуется добавить дополнительную библиотеку liblqr (библиотека жидкостного масштабирования), которой у меня нет в данный момент). Теперь у меня появилась возможность создать «жидкую масштабированную» версию исходного изображения.


Оговорки о разрезе шва / '-liquid-rescale' :

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

 convert WPTgp.jpg -liquid-rescale 599x640\! -scale 290x310 liquid.jpg convert WPTgp.jpg -liquid-rescale 599x640\! -scale 48.4% liquid.jpg 

Помните, что у нас есть оригинальное изображение размером 489×610 пикселей, которое, как ожидается, будет масштабироваться до 290×310 пикселей. Но -liquid-rescale не подходит для масштабирования в двух измерениях одновременно – он предназначен для масштабирования только в одном направлении (горизонтальном или вертикальном). Если вы попытаетесь сделать оба сразу, результаты могут быть не такими, как вы ожидали. Вот результат для первоначально предложенной команды:

  convert WPTgp.jpg -liquid-rescale 290x310\! liquid.jpg 

LQR gone wrong ошибка с изменением жидкости

Вот почему я придумал две измененные команды, которые работают в два этапа:

  1. Во-первых, примените жидкостное масштабирование только к горизонтальной размерности, расширяя ширину оригинала от 489 пикселей до 599 пикселей.
  2. Во-вторых, примените «нормальное» масштабирование пропорций к промежуточному результату для получения конечного изображения.