При создании изображений надо выполнить четыре основных шага:
Холст для изображения можно сделать заново или воспользоваться уже имеющимся рисунком, чтобы поверх него дорисовать что-либо или просто вывести в браузер готовое изображение.
Для работы с изображениями средствами библиотеки GDLib используются функции создания изображений, которые создают либо новое изображение, либо изображение на основе существующего. При этом само изображение сохраняется в оперативной памяти, а функция возвращает дескриптор, который используется другими функциями для доступа к изображению. После завершения работы с изображением оно либо сохраняется на жесткий диск, либо непосредственно выводится в окно браузера.
Примечание. Большинство функций создания изображений возвращают дескриптор открытого изображения в окно браузера. Если вывод предупреждения нежелателен, его можно подавить, добавив перед функцией символ @.
Функции создания изображений
Функция | Описание |
imagecreate($width, $height) | Создает пустое изображение, ограниченное 256 цветами, размерами $width на $height пикселей. Для создания полноцветных изображений следует воспользоваться функцией imagecreatetruecolor() |
imagecreatetruecolor($width, $height) | Создает пустое полноцветное изображение черного цвета размерами $width на $height пикселей |
imagecreatefromjpeg($filename) | Создает изображение на основе JPEG-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imageinterlace($image [, $interlace]) | Для открытого JPEG-изображения (дескриптор $image) включается ($interlace = 1) или выключается ($interlace = 0)черезстрочечное формирование изображения. Параметр $interlace указывает, сколько бит изображения должна вернуть функция |
imagecreatefromgif($filename) | Создает изображение на основе GIF-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagecreatefrompng($filename) | Создает изображение на основе PNG-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagesavealpha($image, $saveflag) |
Если $saveflag = 1, для открытого PNG-изображения $image создается полноценный альфа-канал; в противном случае, если $saveflag = 2, в качестве прозрачного может быть установлен только один цвет изображения. |
imagecreatefromgd($filename) | Создает изображение на основе GD-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagecreatefromgd2($filename) | Создает изображение на основе GD2-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagecreatefromgd2part ($filename, $x, $y, $width, $height) |
Создает изображение на основе файла $filename, приэтом за основу берется не все изображение, а лишь прямоугольник, координаты левого верхнего угла которого определяются параметрами $x, $y, а ширина и высота соответственно параметрами $width и $height |
imagecreatefromstring($str) | Создает изображение из потока, передаваемого в строке $str |
imagecreatefromwbmp ($filename) |
Создает изображение на основе WBMP-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagecreatefromxbm ($filename) |
Создает изображение на основе XBM-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagecreatefromxpm ($filename) |
Создает изображение на основе XPM-файла $filename. В качестве имени файла может использовать сетевой путь, начинающейся с http:// |
imagedestroy($image) | Принимает в качестве параметра $image дескриптор изображения и освобождает занятую им память |
Создание и уничтожение изображения
<?php
//создаем пустое изображение размером 100х100 пикселей
$image=imagecreatetruecolor(100, 100);
echo $image; //Возвращает дескриптор Resource id #2
if(!$image)
{
//Если изображение успешно создано уничтожаем его
imagedestroy ($image);
}
?>
Примечание. Функция imagedestroy() уничтожает не файлы на жестком диске, а их образы в оператьвной памяти.
Создание изображения ра основе существующего JPEG-файла
<?php
//создаем изображение на основе JPEG-файла
$image=imagecreatefromjpeg("images/100-IMGA0390.JPG");
echo $image; //Возвращает дескриптор Resource id #3
if(!$image)
{
//Если изображение успешно создано уничтожаем его
imagedestroy ($image);
}
?>
Данная группа функций позволяет сохранять открытые файлы на жесткий диск или выводить их в окно браузера.
Функции данной группы в качестве первого параметра принимают дескриптор открытого изображения $image. Если ни каких параметров не передается, изображение выводится непосредственно в окно браузера. Если же в качестве второго параметра $filename указывается путь к файлу, изображение сохраняется на жестком диске. В случае успеха функции возвращают true, в случае неудачи false.
Функции сохранения и вывода изображений
Функция | Описание |
imagejpeg($image [, $filename [, $quality]]) | Возвращает или сохраняет в файл $filename изображение в формате JPEG со степенью сжатия $quality. Параметр $quality может принимать значения от 0 до 100 (по умолчанию 75), что соответствует максимальному и минимальному сжатию. При максимальной степени сжатия качество изображения будет минимально |
imagegif($image [, $filename]) | Возвращает или сохраняет в файл $filename изображение в формате GIF |
imagepng($image [, $filename]) | Возвращает или сохраняет в файл $filename изображение в формате PNG |
imagegd($image [, $filename]) | Возвращает или сохраняет в файл $filename изображение в формате GD |
imagegd2($image [, $filename]) | Возвращает или сохраняет в файл $filename изображение в формате GD2 |
imagexdm($image [, $filename [, $foreground]) | Возвращает или сохраняет в файл $filename изображение в формате XBM. Аргумент $foreground содержит идентификатор переднего плана (по умолчанию черный) |
imagewbmp($image [, $filename [, $foreground]) | Возвращает или сохраняет в файл $filename изображение в формате WBMP. Аргумент $foreground содержит идентификатор переднего плана (по умолчанию черный) |
image2wbmp($image [, $filename]) | Возвращает или сохраняет в файл $filename изображение в формате WBMP |
jpeg2wbmp($jpegname, $wbmpname, $height, $width, $threshold) | Конвертирует JPEG-файл $jpegname в файл WBMP-формата $wbmpname. Параметры $height, $width определяют высоту и ширину конечного WBMP-изображения |
png2wbmp($pngname, $wbmpname, $height, $width, $threshold) | Конвертирует PNG-файл $pngname в файл WBMP-формата $wbmpname. Параметры $height, $width определяют высоту и ширину конечного WBMP-изображения |
При выводе изображения в окно браузера при помощи функций из таблицы, следует помнить, что перед отправкой бинарных данных необходимо сообщить браузеру MIME-тип изображения.
Примечание. Для создания файлов в формате JPEG следует включить черезстрочечное создание изображений функции imageinterlace().
Вывод JPEG-изображения
<?php
//Создаем изображение на основе JPEG-файла
$image=imagecreatefromjpeg("images/100-IMGA0390.JPG");
if($image)
{
//Отправляем HTTP-заголовок Content-type
header("Content-type: image/jpeg");
//Выводим изображение в браузер
imagejpeg($image);
//уничтожаем изображение в память
imagedestroy ($image);
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Следует учитывать, что документ не может содержать сразу несколько изображений. Попытка отправить HTTP-заголовки уже после вывода тела документа приведет к сообщению Warning: Cannot modify header information - headers already sent by (Предупреждение: HTTP-заголовки не могут быть изменены, так как они уже отправлены).
Поэтому при использовании библиотеки GDLib скрипт не должен выводить ничего, кроме изображений. Если на странице необходимо вывести несколько динамических изображений, следует обратиться к тегу <IMG>.
Данная группа функций осуществляет изменение размера изображений, поворот и т.д.
Примечание. Часть функций этой группы принимают два дескриптора открытых изображений: источника $src_im и конечного изображения $dst_im.
Функции преобразования изображений
Функция | Описание |
imagecopy ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) |
Копирует область изображения $src_im на изображение $dst_im. Верхний левый угол копируемой области находится в точке с координатами $src_x, $src_y. Параметры $src_w, $src_h определяют ширину и высоту копируемой области соответственно. Скопированная область помещается на изображение $dst_im в точку с координатами $dst_x, $dst_y |
imagecopymerge ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) |
Копирует область изображения $src_im и объединяет ее с изображением $dst_im. При этом можно задать степень прозрачности накладываемого изображения при помощи параметра $pct, который принимает значение от 0 до 100. При значении равном 0 накладываемое изображение становиться полностью прозрачным. При $pct раным 100 функция работает аналогично функции imagecopy(). Остальные параметры функции аналогичны параметрам функции imagecopy() |
imagecopymergegray ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) |
Функция аналогична функции imagecopymerge(), однако при совмещении областей сохраняются оттенки изображения источника $src_im. Сохранение оттенков происходит вследствие удаления цветовой информации из совмещаемых пикселов изображения-назначения $dst_im до операции совмещения |
imagecopyresampled |
Копирует прямоугольную область изображения-источника $src_im на целевое изображение $dst_im. При копировании пиксели интерполируются, чтобы сохранить максимальную четкостьи яркость. Если размеры исходной области назначения различны, топроисходит соответствующее сжатие или растяжение копируемой области. Параметры $src_x, $src_y определяют верхний правый угол прямоугольника на изображении-источнике. Параметры $src_w, $src_h соответственно ширину и высоту этого прямоугольника. Аналогичные параметры с префексом $dst_w, $dst_h определяют параметры прямоугольника на конечном изображении |
imagecopyresized ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) |
Функция аналогична функции imagecopyresampled(), но при копировании не происходит интерполяции копируемых пикселей для сохранения четкости и яркости |
imagerotate($src_im, $angle, $bgd_color) |
Осуществляет поворот изображения $src_im на угол $angle, заданный в градусах. В аргументе $bgd_color передается идентификатор фонового цвета для заливки пустых областей, которые будут получены в процессе поворота изображения |
imagefilter($src_im, $filtertype [, $args]) |
Применяет фильтр к изображению $src_im |
Уменьшение размера изображения оформим в виде отдельной функции resizeimg (). Функция будет принимать четыре параметра:
resizeimg ($filename, $smallimage, $w, $h)
Функция изменения размера изображения
<?php
function resizeimg ($filename, $smallimage, $w, $h)
{
//1. Коррекция параметров $w, $h
//Определяем коэффициэнт сжатия изображения
$ratio=$w/$h;
//Получим размеры исходного изображения
list($width, $height)=getimagesize($filename);
//Если размеры меньше, то маштабирование не нужно
if(($width<$w) && ($height<$h))
{
copy($filename, $smallimege);
return true;
}
//Получаем коэффициент сжатия исходного изображения
$src_ratio=$width/$height;
//Вычисляем размеры уменьшенной копии, чтобы
//при маштабировании сохранились пропорции
//исходного изображения
if($ratio<$src_ratio) $h=$w/$src_ratio;
else $w=$h*$src_ratio;
///////////////////////////////////////////////
//2.Создание уменьшенной копии изображения
//Создаем пустое изображение
//размером $wx$h пикселей
$dest_img=imagecreatetruecolor($w, $h);
//Открываем файл, который будет подвергаться сжатию
$src_img=imagecreatefromjpeg($filename);
//Маштабируем изображение
imagecopyresampled($dest_img, $src_img,
0, 0,
0, 0,
$w, $h,
$width, $height);
//Сохраняем уменьшенную копию в файл
imagejpeg($dest_img, $smallimege);
//Чистим память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);
return true;
}
?>
Первая часть функции посвящена коррекции входных параметров $w, $h, задающих ширину ивысоту уменьшенного изображения. Это необходимо для того, чтобы изображение не было искажено преобразованием. Вторая часть функции предназначена для создания уменьшенной копии $smallimege из исходного изображения $filename. Уменьшенное изображение создается при помощи функции imagecreatetruecolor(), которая возвращает дескриптор $dest_img. Дескриптор исходного изображения $src_img открывается при помощи функции imagecreatefromjpeg(). После этого исходное изображение переносится на уменьшенную копию при помощи функции imagecopyresampled().
Рассмотрим пример подключения функции resizeimg().
Создание уменьшенной копии изображения с использование функции resizeimg()
<?php
//Подключаем файл с функцией resizeimg()
require_once("483.php");
//Вызываем функцию resizeimg()
//автоматического маштабирования изображения 100-IMGA0390.JPG,
//уменьшенную копию которого следует записать в файл img_small.jpg
//Максимальные размеры ограничены 320 пикселями
//по ширине и 180 пикселями по высоте
resizeimg("images/100-IMGA0390.JPG","images/img_small.jpg", 320,180)
?>
После вызова скрипта, в корневом каталоге сайта, новый появится файл
img_small.jpg.
Вывод изображения img_small.jpg
<?php
//Создаем изображение на основе JPEG-файла
$image=imagecreatefromjpeg("images/img_small.jpg");
if($image)
{
//Отправляем HTTP-заголовок Content-type
header("Content-type: image/jpeg");
//Выводим изображение в браузер
imagejpeg($image);
//уничтожаем изображение в память
imagedestroy ($image);
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Для поворота изображения удобно воспользоваться функцией imagerotate().
Примечание. Третий параметр функции imagerotate() требует задания цвета. Функция для формирования цвета будет рассматриваться далее.
Поворот изображения при помощи функции imagerotate()
<?php
//создадим изображение на основе JPEG-файла
$image=imagecreatefromjpeg ("images/100-IMGA0390.JPG");
if($image)
{
//Задаем белый цвет
$white=imagecolorallocate($image, 255, 255, 255);
//Поворачиваем изображение на 45 градусов
$rotate=imagerotate($image, 45, $white);
//Отправляем заголовок Content-type
header("Content-type: image/jpeg");
//Выводим изображение в браузер
imagejpeg($rotate);
//Уничтожаем изображение в памяти
imagedestroy ($image);
imagedestroy($rotate);
}
?>
В окне веб-браузера это будет выглядеть ТАК.