Пытается генерировать пропорционально обрезанные миниатюры с фиксированной шириной / высотой с помощью PHP GD

Я пытаюсь создать Thumbnail Generator в PHP с GD, который возьмет изображение и уменьшит его до фиксированной ширины / высоты. Квадрат, который он берет с исходного изображения (основанный на моей фиксированной ширине / высоте), будет поступать из центра изображения, чтобы получить пропорционально правильную миниатюру.

Я попытаюсь продемонстрировать это запутанное предложение с некоторым приятным ASCII:}

LANDSCAPE EXAMPLE: XXXXXXXXXXXXXXXX XXXXOOOOOOOOXXXX XXXXOOOOOOOOXXXX XXXXOOOOOOOOXXXX XXXXOOOOOOOOXXXX XXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX PORTRAIT EXAMPLE: XXXXXXXX XXXXXXXX OOOOOOOO OOOOOOOO OOOOOOOO OOOOOOOO XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX 

Как вы можете видеть, он вытаскивает квадрат из центра изображения для использования в качестве миниатюры. В теории кажется простым, чтобы получить высоту / ширину изображения, а затем вычислить смещение на основе моей фиксированной ширины / высоты, чтобы получить эскиз. Но я не могу придумать, как его кодировать: /

Кроме того, как я могу изменить размер изображения, прежде чем вытащить центральную площадь? Итак, в миниатюре содержится подробное изображение оригинала, а не увеличенное изображение?

Извините, если я предлагаю косвенный ответ. Но вы можете попробовать использовать эту библиотеку: PHPThumb . Он очень прост в использовании. Он поддерживает GD и имеет эту функцию под названием адаптивное изменение размера, которое изменяет размер изображения из центра.

Вот пример кода из документов для адаптивного изменения размера:

 <?php require_once 'path/to/ThumbLib.inc.php'; try { $thumb = PhpThumbFactory::create('/path/to/image.jpg'); } catch (Exception $e) { // handle error here however you'd like } $thumb->adaptiveResize(175, 175); $thumb->show(); ?> 

Это то, что вы ищете:

Crop-To-Fit изображение с использованием ASP / PHP

Сценарий можно использовать для создания квадратных миниатюр из портретов / пейзажных изображений. Решение требует двух шагов:

1: пропорционально изменяйте изображение таким образом, чтобы одно из размеров соответствовало требуемому размеру, в то время как другое равно или больше.

  • Пример 1: чтобы обрезать изображение 1024x768px (ar = 1.33) до 200x200px, вы должны пропорционально изменить размер изображения до 266x200px (ar = 1.33)
  • Пример 2. Чтобы обрезать изображение размером 600×900 пикселей (ar = 0,66) до 200×200 пикселей, вы должны пропорционально изменить размер изображения до 200x300px (ar = 0,66)

2: обрезка с середины изображения; математика проста.

  • Пример 1: Чтобы извлечь часть размером 200x200px из изображения 266x200px, урожай с 33,0
  • Пример 2. Чтобы извлечь часть 200x200px из изображения 200x300px, урожай с 0,50

Пейзаж

Обрезка портрета

Как насчет этого: изображение любого размера и пропорциональное изменение его размера (или вверх), чтобы заполнить холст любых размеров.

Например, исходное изображение: 400w x 600h и размер эскиза должно быть 100w x 225h – выходное изображение будет 100w x 225h, а изображения будут вертикально центрированы с шириной 100 (максимум) и высотой 150 (с верхней и верхней нижняя граница 37,5 пикселей)

Вот функция

 function resize_to_canvas($filename,$canvas_w=100,$canvas_h=225){ list($width, $height, $type) = getimagesize($filename); $original_overcanvas_w = $width/$canvas_w; $original_overcanvas_h = $height/$canvas_h; $dst_w = round($width/max($original_overcanvas_w,$original_overcanvas_h),0); $dst_h = round($height/max($original_overcanvas_w,$original_overcanvas_h),0); $dst_image = imagecreatetruecolor($canvas_w, $canvas_h); $background = imagecolorallocate($dst_image, 255, 255, 255); imagefill($dst_image, 0, 0, $background); $src_image = imagecreatefromjpeg($filename); imagecopyresampled($dst_image, $src_image, ($canvas_w-$dst_w)/2, ($canvas_h-$dst_h)/2, 0, 0, $dst_w, $dst_h, $width, $height); imagegif($dst_image, $filename); imagedestroy($dst_image);} 

Эта функция заменит исходный файл, но будет легко изменена, чтобы создать новое уменьшенное изображение. Просто измените имя файла на строку imagegif ($ dst_image, $ filename);

Без четкой и четко определенной цели трудно попытаться предложить хорошо подходящее решение. Кроме того, вы, как правило, найдете других штабелеров более полезными, если по крайней мере попытаетесь найти решение для таблицы.

Это, как говорится, я нашел пару онлайн-учебников, которые могут по крайней мере дать вам идею, чтобы начать с этого – дайте ему уйти, и, если у вас все еще есть проблемы, не стесняйтесь оставлять дополнительные вопросы (с примерами кода и деталями что не ведет себя).

  • Обрезка с помощью GD
  • Создание обрезанных миниатюр с помощью библиотеки GD