Изменение размеров изображения

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык PHP

Как таковой, функции изменения размеров изображения в библиотеке GD нет. Есть две функции копирования части одного изображения в другое с изменением размеров копируемой части. Это функции imagecopyresized() и imagecopyresampled().

Функция imagecopyresampled() появилась в библиотеке GD с версии 2.0.1 и отличается от imagecopyresampled() тем, что при изменении размеров плавно интерполируются значения цветов в точках изображения. Это отличие хорошо иллюстрируют следующие рисунки:

1
Оригинал

3
imagecopyresize() — изображение уменьшено в три раза

2
imagecopyresample — изображение уменьшено в три раза()

Об ограничениях на работу функции imagecopyresampled() с палитровыми изображениями в документации по PHP ничего не сказано. Более того, там есть сноска, в которой описываются проблемы, возникающие с палитровыми изображениями. Из этого можно было бы сделать вывод, что функция работает с такими изображениями, но, просмотрев исходный код функции я убедился в обратном:

if (!dst->trueColor) {
    gdImageCopyResized (dst, src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
    return;
}

В примерах мы будем использовать функцию imagecopyresampled(), но если у вас более старая версия GD, то просто замените «resampled» на «resized».

Пример 1: Функция изменяющая размер изображения.

<?
function imageresize($outfile,$infile,$neww,$newh,$quality) {

    $im=imagecreatefromjpeg($infile);
    $im1=imagecreatetruecolor($neww,$newh);
    imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",320,240,75);

?>

В данном примере не задано имя выходного файла. Это не ошибка. При использовании пустого имени файла, данные перенаправляются в стандартный вывод.

Пример 2: Изменение размеров изображения с заданным коэффициентом.

<?
function imageresize($outfile,$infile,$percents,$quality) {
    $im=imagecreatefromjpeg($infile);
    $w=imagesx($im)*$percents/100;
    $h=imagesy($im)*$percents/100;
    $im1=imagecreatetruecolor($w,$h);
    imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",30,75);

?>

Иногда необходимо вписать новое изображение в определенные рамки, например как на сервере fota.mota.ru. В таком случае можно воспользоваться следующей функцией:

Пример 3: Изменение размеров изображения с вписыванием в рамки

<?
function imageresize($outfile,$infile,$neww,$newh,$quality) {
    $im=imagecreatefromjpeg($infile);
    $k1=$neww/imagesx($im);
    $k2=$newh/imagesy($im);
    $k=$k1>$k2?$k2:$k1;

    $w=intval(imagesx($im)*$k);
    $h=intval(imagesy($im)*$k);

    $im1=imagecreatetruecolor($w,$h);
    imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",640,240,75);

?>

Автор: mike (www.codenet.ru)
Источник: http://www.php.su/articles/?cat=graph&page=014

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты