Изменение размера изображения PHP - Мнения хотели - PullRequest
2 голосов
/ 08 июня 2011

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

Я использую библиотеку php imageGD imagejpeg () и т. Д.

Я постоянно обновлял свой класс, чтобы попытаться «решить» эту ситуацию:

Если изображение, которое пользователь загружает, скажем, 469x358, и конечное изображение дисплея должно быть или предназначено для размещения, например, в рамке размером 120x80. Если я изменяю размер в зависимости от ширины, результирующее изображение с измененным размером будет 120x92, я мог бы тогда просто зафиксировать высоту, но это будет пикселировать или раздавить изображение, я мог бы также обрезать конец с скрытым переполнением либо imageGD, либо css.

Я быстро посмотрел и увидел, что есть алгоритмы (бикубические и т. Д.), Которые вы можете использовать для сжатия изображения, которое обостряет его, чтобы оно не выглядело сжатым, что является постоянным эффектом, который я, кажется, получаю с imageGD. Кто-нибудь использовал этот алгоритм?

Я также видел, что ImageMagick кто-нибудь использовал это программное обеспечение? Это уменьшает изображение лучше?

В настоящее время я обрезаю конец со скрытым переполнением, но есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Если изображение загружается пользователем, скажем 469x358 и конечное изображение дисплея должен быть или разработан, чтобы соответствовать в коробке 120x80, например. Если я изменить размер в зависимости от ширины результирующего измененное изображение будет 120x92, я мог только тогда исправьте высоту, но это будет Pixelate или раздавить изображение, я мог также обрезать конец либо Переполнение imageGD или css скрыто.

Если ваше изображение было 358x469 (портрет) и вы хотите изменить его размер до 120x80, чтобы изображение не выглядело искаженным, вот математика:

358/469 = width/80 => width = 358*80/469 = 61px (approx)

У нас было более высокое изображение, мы будем использовать максимальную высоту и ограниченную ширину. Желаемая ширина 120 пикселей означает, что изображение растянуто по горизонтали; с помощью лучшего алгоритма вы можете добиться только плавности, но вы не можете сделать сжатое / растянутое изображение нормальным с помощью лучшего алгоритма.

Если требуется подгонка, я советую вам подгонять под размер или подгонять. Вы можете сделать это на стороне сервера через библиотеку GD / ImageMagick или на стороне клиента, используя фоновое позиционирование CSS. Если вы используете GD, обрезка так же проста, как изменение размера изображения с отрицательными смещениями (что-то вроде CSS-позиционирования фона с отрицательным background-position).

Редактировать 1

Если речь идет о том, использовать ли GD или IM, я бы предложил IM. Я не уверен в качестве вывода, но с точки зрения производительности IM превзойдет GD, особенно когда вы работаете с изображениями с высоким разрешением. Если вы предпочитаете GD, функция библиотеки GD imagecopyresampled даст вам лучшие результаты по сравнению с imagecopyresized, но с более высокой загрузкой процессора и / или памяти.

Редактировать 2

Я забыл упомянуть, я давно перестал использовать GD и переключился на phpThumb . Заботится о большинстве дел по дому. Внутренне он использует GD и / или IM - встроенный интеллект позволяет выбирать наилучший доступный метод для данной операции.

0 голосов
/ 08 июня 2011

Несколько моментов, которые могут помочь вам решить.

  • Преобразованные выходные данные из ImageMagick и gd2 были в значительной степени похожи. Я не уверен, какой тип ресемплинга выполняет gd2, и я совершенно уверен, что ImageMagick использует бикубическую интерполяцию, но в любом случае, в большинстве случаев бикубическая и билинейная ресэмплинг генерируют выходные данные, которые практически идентичны при сокращении. Повышение масштаба небольшого изображения - это место, где бикубическая интерполяция действительно стоит особняком. (Тем не менее, есть некоторые патологические случаи, когда различие между бикубической и билинейной интерполяцией может быть поразительным - проверьте http://en.wikipedia.org/wiki/Aliasing)

  • У меня не было особых шансов использовать модуль ImageMagick в PHP, хотя версия CLI была невероятно быстрой для повторной выборки изображений. Если предположить, что модуль Imagick работает так же быстро, вы должны увидеть высокую производительность. Тем не менее, в случае с gd2, скорость была немного проблемой - я часто использовал ее для генерации 50 с лишним миниатюр на страницу, и отставание заметно.

  • gd2 является частью большинства установок PHP, и API довольно прост в использовании. Imagick похоже на расширение PECL. В зависимости от вашего хостинг-провайдера, это может быть или не быть проблемой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...