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

Я пытаюсь создать 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

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

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

Ответы [ 4 ]

3 голосов
/ 24 мая 2010

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

Обрезать изображение по ASP / PHP

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

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

  • Пример 1: для обрезки изображения размером 1024x768px (ar = 1,33) до 200x200px необходимо пропорционально изменить размер изображения до 266x200px (ar = 1,33)
  • Пример 2: для обрезки изображения размером 600x900 пикселей (ar = 0,66) до 200x200 пикселей необходимо пропорционально изменить размер изображения до 200x300px (ar = 0,66)

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

  • Пример 1: для извлечения части размером 200x200px из изображения 266x200px, обрезать с 33,0
  • Пример 2. Извлечение фрагмента размером 200x200 пикселей из изображения размером 200x300 пикселей, обрезка с 0,50

Landscape cropping

Portrait cropping

3 голосов
/ 24 мая 2010

Извините, если я предлагаю косвенный ответ.Но вы можете попробовать использовать эту библиотеку: 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();

?>
1 голос
/ 08 июня 2010

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

Например, исходное изображение: 400 Вт x 600 ч, а размер эскиза долженбыть 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);

0 голосов
/ 24 мая 2010

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

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

...