Изменение размеров изображения
Автор: mike (www.codenet.ru)
Как таковой, функции изменения размеров изображения в библиотеке
GD нет. Есть две функции копирования части одного изображения в
другое с изменением размеров копируемой части. Это функции
imagecopyresized() и imagecopyresampled().
Функция imagecopyresampled() появилась в библиотеке GD с версии
2.0.1 и отличается от imagecopyresampled() тем, что при изменении
размеров плавно интерполируются значения цветов в точках
изображения. Это отличие хорошо иллюстрируют следующие рисунки:
Оригинал
imagecopyresize()
- изображение уменьшено в три раза
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);
?>
Ссылки по теме