Январь 25, 2006
Сложное масштабирование изображений в PHP (Часть 2)
Следующее условие отвечает за размер выводимой картинки и непосредственно за вывод. Возможно, что исходная картинка уже нужного размера. Если это не так, обработаем её.
Для этого поставим следующее условие:
// если размер исходного изображения
// отличается от требуемого размера
if ($w_src != $w)
{
Следующая часть программы будет подгонять картинку под ширину 218 пикселей (пропорциональное уменьшение) для случая $type=1.
// операции для получения прямоугольного файла
if ($type==2)
{
// вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);
// создаём пустую картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w_dest,$h_dest);
$str = "foxweb.net.ru";
imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
Вначале вычисляем коэффициент $ratio, чтобы сразу вычислить размеры результирующей картинки $w_dest и $h_dest. Потом создаём новую картинку $dest с таким же размерами, это заготовка для масштабированной картинки. Самая сложная часть алгоритма – функция imagecopyresized. В ней я указал результирующую и исходную картинку, координаты левого верхнего угла для обоих картинок (0, 0, 0, 0) и координаты правого нижнего угла для обоих картинок ($w_dest, $h_dest, $w_src, $h_src).
Вот официальная справка на эту функцию:
imagecopyresized - копирует и изменяет размеры части изображения
int imagecopyresized ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
imagecopyresized() копирует прямоугольную часть одного изображения в другое изображение. Dst_im - результирующее изображение, src_im - исходное изображение. Если исходные и координаты расположения и ширины и высот отличаются, будет выполнено растяжение или сжатие фрагмента изображения. Начало координат - верхний левый угол. Эта функция может быть использована, чтобы копировать области в пределах того же изображения (если dst_im и src_im совпадают), но если области перекрывают результаты быть непредсказуемым.
Вместо неё можно использовать imagecopyresampled() - ресемплирование со сглаживанием. Картинка получится более качественной. Подробнее о параметрах функции можно узнать в документации на сайте.
продолжение следует...
Часть 1 |
Часть 3 |
Разместил:
Автор: fox++