Изменение размеров изображения
Как таковой, функции изменения размеров изображения в библиотеке 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".
Пример 33: Функция изменяющая размер изображения.
<? 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); ?>
В данном примере не задано имя выходного файла. Это не ошибка. При использовании пустого имени файла, данные перенаправляются в стандартный вывод.
Пример 34: Изменение размеров изображения с заданным коэффициентом.
<? 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. В таком случае можно воспользоваться следующей функцией:
Пример 35: Изменение размеров изображения с вписыванием в рамки
<? 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); ?>
Ссылки по теме
Оставить комментарий
Комментарии
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);
}
$d=opendir("img/user/");
while(($e=readdir($d)) !==false) {
if (!ereg("^(.*)\\.(jpg)$",$e,$P)) continue;
$patche="img/user/$e";
$foto = imageresize("","$patche",75,75);
echo ("<img src='" . $foto. "'>"."<BR>");
}
По идее этот скрипт создает функцию сжатия, потом ищет все файлы JPEG и
должен вывести все фото на экран, но выводит только первую, остальные игнорирует! Подскажите, чего здесь не хватает?
"Функция imagecopyresampled() появилась в библиотеке GD с версии 2.0.1 и отличается от imagecopyresampled() тем, что при изменении размеров <...>"
Вместо второй imagecopyresampled() должно быть imagecopyresize()