1. Главная страница » Компьютеры » Php работа с изображением

Php работа с изображением

Автор: | 16.12.2019

Библиотека GD дает возможность работать с изображениями в PHP. Подробнее о функциях на php.net.

Далее представлены примеры как изменить размер, вырезать часть изображения и т.д. Все примеры универсальные и работают с разными типами файлов без изменений кода, у PNG файлов сохраняется прозрачность.

Открытие изображения

Итак, есть исходное изображение PNG 400x400px:

С помощью функции getimagesize() получим ширину, высоту и тип, далее откроем его функциями в зависимости от типа:

Изменение размера изображения (resize)

Приведенный код уменьшает или увеличивает изображение не искажая его пропорции.

Результат

$w = 200;
$h = 0;
$w = 200;
$h = 100;
$w = 100;
$h = 200;

Обрезать изображение (crop)

Пример вырезает из исходного изображения часть размером $w на $h .
$x и $y задают начальные координаты в пикселях или процентах.

Результат

$x = 0;
$y = 0;
$x = ‘50%’;
$y = ‘0%’;
$x = ‘100%’;
$y = ‘0%’;

Поворот изображения

Функция imagerotate() поворачивает изображение на заданный угол против часовой стрелки, отрицательный угол меняет направление поворота.

Поворот на не ровный угол увеличит ширину и высоту фото:

Зеркальное отражение

Imageflip() зеркалит изображение, могут быть следующие параметры:

IMG_FLIP_HORIZONTAL По горизонтали
IMG_FLIP_VERTICAL По вертикали
IMG_FLIP_BOTH По горизонтали и вертикали

Наложение водяного знака (watermark)

Для защиты на картинки наносят копирайт, например, данный скрип накладывает картинку watermark.png на основное изображение:

Результат

$x = ‘50%’;
$y = ‘50%’;
$x = ‘100%’;
$y = ‘0%’;
$x = ‘100%’;
$y = ‘100%’;

Добавление фона

Актуально для PNG с прозрачностью. Скрипт вставит на задний фон картинку с положением $x и $y . Размер основного изображения не изменится.

Фон
Результат

Фильтры

Функция imagefilter() применяет фильтр к изображению.
В параметре $filtertype указывается константа применяемого фильтра, а в следующих его настройки.

IMG_FILTER_NEGATE

Инвертирует цвета изображения.

IMG_FILTER_GRAYSCALE

Преобразует цвета изображения в градации серого.

IMG_FILTER_COLORIZE

Преобразует цвета изображения в градации заданного цвета в формате RGB.

0, 240, 120
150, 240, 120
90, 240, 90

IMG_FILTER_BRIGHTNESS

Изменяет яркость изображения, диапазон от -255 до 255.

-200
-100
100
200

IMG_FILTER_CONTRAST

Изменяет контрастность изображения. Уровень может быть от -100 до 100.

-100
-50
50
100

IMG_FILTER_EDGEDETECT

Использует определение границ для их подсветки.

Содержание

  • gd_info — Вывод информации о текущей установленной GD библиотеке
  • getimagesize — Получение размера изображения
  • getimagesizefromstring — Получение размера изображения из строки данных
  • image_type_to_extension — Получение расширения файла для типа изображения
  • image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
  • image2wbmp — Выводит изображение в браузер или пишет в файл
  • imageaffine — Вернуть изображение, содержащее аффинно преобразованное изображение src, используя дополнительную область ограничения
  • imageaffinematrixconcat — Concatenate two affine transformation matrices
  • imageaffinematrixget — Get an affine transformation matrix
  • imagealphablending — Задание режима сопряжения цветов для изображения
  • imageantialias — Требуется ли применять функции сглаживания или нет
  • imagearc — Рисование дуги
  • imagebmp — Вывести BMP-изображение в браузер или файл
  • imagechar — Рисование символа по горизонтали
  • imagecharup — Рисование символа вертикально
  • imagecolorallocate — Создание цвета для изображения
  • imagecolorallocatealpha — Создание цвета для изображения
  • imagecolorat — Получение индекса цвета пиксела
  • imagecolorclosest — Получение индекса цвета ближайшего к заданному
  • imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учетом прозрачности
  • imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение
  • imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения
  • imagecolorexact — Получение индекса заданного цвета
  • imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента
  • imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии
  • imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог
  • imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
  • imagecolorset — Установка набора цветов для заданного индекса палитры
  • imagecolorsforindex — Получение цветов, соответствующих индексу
  • imagecolorstotal — Определение количества цветов в палитре изображения
  • imagecolortransparent — Определяет цвет как прозрачный
  • imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
  • imagecopy — Копирование части изображения
  • imagecopymerge — Копирует часть изображения с наложением
  • imagecopymergegray — Копирует часть изображения с наложением в градациях серого
  • imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
  • imagecopyresized — Копирование и изменение размера части изображения
  • imagecreate — Создание нового палитрового изображения
  • imagecreatefrombmp — Создает новое изображение из файла или URL
  • imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL
  • imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL
  • imagecreatefromgd — Создание нового изображения на основе GD файла или URL
  • imagecreatefromgif — Создает новое изображение из файла или URL
  • imagecreatefromjpeg — Создает новое изображение из файла или URL
  • imagecreatefrompng — Создает новое изображение из файла или URL
  • imagecreatefromstring — Создание нового изображения из потока представленного строкой
  • imagecreatefromwbmp — Создает новое изображение из файла или URL
  • imagecreatefromwebp — Создает новое изображение из файла или URL
  • imagecreatefromxbm — Создает новое изображение из файла или URL
  • imagecreatefromxpm — Создает новое изображение из файла или URL
  • imagecreatetruecolor — Создание нового полноцветного изображения
  • imagecrop — Обрезать изображение до заданного прямоугольника
  • imagecropauto — Crop an image automatically using one of the available modes
  • imagedashedline — Рисование пунктирной линии
  • imagedestroy — Уничтожение изображения
  • imageellipse — Рисование эллипса
  • imagefill — Заливка
  • imagefilledarc — Рисование и заливка дуги
  • imagefilledellipse — Рисование закрашенного эллипса
  • imagefilledpolygon — Рисование закрашенного многоугольника
  • imagefilledrectangle — Рисование закрашенного прямоугольника
  • imagefilltoborder — Заливка цветом
  • imagefilter — Применяет фильтр к изображению
  • imageflip — Flips an image using a given mode
  • imagefontheight — Получение высоты шрифта
  • imagefontwidth — Получение ширины шрифта
  • imageftbbox — Определение границ текста выводимого шрифтом freetype2
  • imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
  • imagegammacorrect — Применение гамма коррекции к GD изображению
  • imagegd2 — Вывод GD2 изображения в браузер или файл
  • imagegd — Вывод GD-изображения в браузер или в файл
  • imagegetclip — Получить отсекающий прямоугольник
  • imagegif — Выводит изображение в браузер или пишет в файл
  • imagegrabscreen — Захватывает изображение с экрана
  • imagegrabwindow — Захватывает изображение окна
  • imageinterlace — Включение или выключение интерлейсинга
  • imageistruecolor — Определяет, является ли изображение полноцветным
  • imagejpeg — Выводит изображение в браузер или пишет в файл
  • imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений
  • imageline — Рисование линии
  • imageloadfont — Загрузка шрифта
  • imageopenpolygon — Рисует открытый полигон
  • imagepalettecopy — Копирование палитры из одного изображения в другое
  • imagepalettetotruecolor — Преобразует изображение на основе палитры в настоящий цвет
  • imagepng — Вывод PNG изображения в браузер или файл
  • imagepolygon — Рисование многоугольника
  • imagepsbbox — Выдает параметры рамки, обрамляющей текст написанный шрифтом PostScript Type1
  • imagepsencodefont — Изменение вектора кодировки шрифта
  • imagepsextendfont — Растягивание или сжатие шрифта
  • imagepsfreefont — Освобождение памяти, занятой шрифтом PostScript Type
  • imagepsloadfont — Загрузка шрифта PostScript Type 1 из файла
  • imagepsslantfont — Наклон шрифта
  • imagepstext — Рисование текста поверх изображения, используя шрифты PostScript Type1
  • imagerectangle — Рисование прямоугольника
  • imageresolution — Get or set the resolution of the image
  • imagerotate — Поворот изображения с заданным углом
  • imagesavealpha — Сохранять ли полную информацию альфа-канала при сохранении изображений PNG
  • imagescale — Масштабировать изображение по заданной ширине и высоте
  • imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии
  • imagesetclip — Установите прямоугольник ограничения
  • imagesetinterpolation — Set the interpolation method
  • imagesetpixel — Рисование точки
  • imagesetstyle — Установка стиля рисования линий
  • imagesetthickness — Установка толщины линий
  • imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
  • imagestring — Рисование строки текста горизонтально
  • imagestringup — Рисование строки текста вертикально
  • imagesx — Получение ширины изображения
  • imagesy — Получение высоты изображения
  • imagetruecolortopalette — Преобразование полноцветного изображения в палитровое
  • imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
  • imagettftext — Рисование текста на изображении шрифтом TrueType
  • imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой
  • imagewbmp — Выводит изображение в браузер или пишет в файл
  • imagewebp — Вывод изображения WebP в браузер или файл
  • imagexbm — Вывод XBM изображения в браузер или файл
  • iptcembed — Встраивание двоичных IPTC данных в JPEG изображение
  • iptcparse — Разбор двоичных IPTC данных на отдельные тэги
  • jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP
  • png2wbmp — Преобразование PNG файла в WBMP
Читайте также:  Metro last light оптимизация для слабых пк

User Contributed Notes 9 notes

I wrote a simple function to convert an image resource to PGM (portable graymap) in order to feed it to an OCR program. It works just like the rest of the image output functions, and will convert to grayscale for you:

function imagepgm ( $image , $filename = null )
<
$pgm = "P5 " . imagesx ( $image ). " " . imagesy ( $image ). " 255
" ;
for( $y = 0 ; $y imagesy ( $image ); $y ++)
<
for( $x = 0 ; $x imagesx ( $image ); $x ++)
<
$colors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , $y ));
$pgm .= chr ( 0.3 * $colors [ "red" ] + 0.59 * $colors [ "green" ] + 0.11 * $colors [ "blue" ]);
>
>
if( $filename != null )
<
$fp = fopen ( $filename , "w" );
fwrite ( $fp , $pgm );
fclose ( $fp );
>
else
<
return $pgm ;
>
>
?>

Representation decimal of a color in hexadecimal for use on functions of library GD.

// Representation hexadecimal
$var = ‘#FFFFFF’ ;

function getRgbFromGd ( $color_hex ) <

return array_map ( ‘hexdec’ , explode ( ‘|’ , wordwrap ( substr ( $color_hex , 1 ), 2 , ‘|’ , 1 )));

print_r ( getRgbFromGd ( $var ));

// Output: Array ( [0] => 255 [1] => 255 [2] => 255 )

I know this might look somewhat superfluous to others, but i once came across a situation where i needed a *strong* blur on an image without having ImageMagick installed. Executing the convolution-filter several times on the same image is awfully slow and still doesn’t give a good blur.

The function below accepts a truecolor-image and a blur-factor between 0.0 and 1.0. Beware: It’s still quite slow.

function blurImage ( $srcimg , $blur )
<
$blur = $blur * $blur ;
$blur = max ( 0 , min ( 1 , $blur ));

$srcw = imagesx ( $srcimg );
$srch = imagesy ( $srcimg );

$dstimg = imagecreatetruecolor ( $srcw , $srch );

$f1a = $blur ;
$f1b = 1.0 — $blur ;

$cr = 0 ; $cg = 0 ; $cb = 0 ;
$nr = 0 ; $ng = 0 ; $nb = 0 ;

$rgb = imagecolorat ( $srcimg , 0 , 0 );
$or = ( $rgb >> 16 ) & 0xFF ;
$og = ( $rgb >> 8 ) & 0xFF ;
$ob = ( $rgb ) & 0xFF ;

$nr = ( $cr * $f1a ) + ( $or * $f1b );
$ng = ( $cg * $f1a ) + ( $og * $f1b );
$nb = ( $cb * $f1a ) + ( $ob * $f1b );

$or = $nr ;
$og = $ng ;
$ob = $nb ;

$rgb = imagecolorat ( $srcimg , 0 , $y );
$or = ( $rgb >> 16 ) & 0xFF ;
$og = ( $rgb >> 8 ) & 0xFF ;
$ob = ( $rgb ) & 0xFF ;

$x = $srcw ;
while ( $x —)
<
//horizontal
$rgb = imagecolorat ( $srcimg , $x , $y );
$cr = ( $rgb >> 16 ) & 0xFF ;
$cg = ( $rgb >> 8 ) & 0xFF ;
$cb = ( $rgb ) & 0xFF ;

$nr = ( $cr * $f1a ) + ( $or * $f1b );
$ng = ( $cg * $f1a ) + ( $og * $f1b );
$nb = ( $cb * $f1a ) + ( $ob * $f1b );

$or = $nr ;
$og = $ng ;
$ob = $nb ;

//vertical
$rgb = imagecolorat ( $dstimg , $x , $y + 1 );
$vr = ( $rgb >> 16 ) & 0xFF ;
$vg = ( $rgb >> 8 ) & 0xFF ;
$vb = ( $rgb ) & 0xFF ;

$nr = ( $nr * $f1a ) + ( $vr * $f1b );
$ng = ( $ng * $f1a ) + ( $vg * $f1b );
$nb = ( $nb * $f1a ) + ( $vb * $f1b );

$vr = $nr ;
$vg = $ng ;
$vb = $nb ;

imagesetpixel ( $dstimg , $x , $y ,( $nr 16 ) | ( $ng 8 ) | ( $nb ));
>

$srcimg = imagecreatefromjpeg ( "test.jpg" );
$dstimg = blurImage ( $srcimg , 0.2 );

header ( ‘Content-type: image/jpeg’ );
echo( imagejpeg ( $dstimg ) );
exit();

If you happen to need a way to output a Windows BMP file (e.g. when using the PEAR ExcelWriter), feel free to use the following code:

function imagebmp ( $im , $fn = false )
<
if (! $im ) return false ;

if ( $fn === false ) $fn = ‘php://output’ ;
$f = fopen ( $fn , "w" );
if (! $f ) return false ;

//Image dimensions
$biWidth = imagesx ( $im );
$biHeight = imagesy ( $im );
$biBPLine = $biWidth * 3 ;
$biStride = ( $biBPLine + 3 ) &

3 ;
$biSizeImage = $biStride * $biHeight ;
$bfOffBits = 54 ;
$bfSize = $bfOffBits + $biSizeImage ;

//BITMAPFILEHEADER
fwrite ( $f , ‘BM’ , 2 );
fwrite ( $f , pack ( ‘VvvV’ , $bfSize , 0 , 0 , $bfOffBits ));

//BITMAPINFO (BITMAPINFOHEADER)
fwrite ( $f , pack ( ‘VVVvvVVVVVV’ , 40 , $biWidth , $biHeight , 1 , 24 , 0 , $biSizeImage , 0 , 0 , 0 , 0 ));

$numpad = $biStride — $biBPLine ;
for ( $y = $biHeight — 1 ; $y >= 0 ; — $y )
<
for ( $x = 0 ; $x $biWidth ; ++ $x )
<
$col = imagecolorat ( $im , $x , $y );
fwrite ( $f , pack ( ‘V’ , $col ), 3 );
>
for ( $i = 0 ; $i $numpad ; ++ $i )
fwrite ( $f , pack ( ‘C’ , 0 ));
>
fclose ( $f );
return true ;
>
?>

It works the same way as regular imagejpeg/imagepng do and only supports GD2.0 true colour bitmaps (which is what’s required by ExcelWriter).

This is an example of get high resolution images.

/**
* Class name : resizeImage
* Created by : wang
* Description : This class is to resize the image from original size to new size
*/
class resizeImage
<
/**
* Function name : resize_img
* Description : This function is to resize image
* @param : $origimg variable is the original image
* @param : $newimg variable is the new image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
public function resize_img ( $origimg , $newimg , $w , $h ) <
$info = getimagesize ( $origimg );
$mime = $info [ ‘mime’ ];

// Make sure that the requested file is actually an image
if( substr ( $mime , 0 , 6 ) != ‘image/’ )
<
header ( ‘HTTP/1.1 400 Bad Request’ );
return ‘Error: requested file is not an accepted type: ‘ . $origimg ;
exit();
>

// Check they extention of image
$extension = image_type_to_extension ( $info [ 2 ]);
if( strtolower ( $extension ) == ‘.png’ ) <
$img = $this -> resize_imagepng ( $origimg , $w , $h );
imagepng ( $img , $newimg );
imagedestroy ( $img );
>elseif( strtolower ( $extension ) == ‘.jpeg’ ) <
$img = $this -> resize_imagejpeg ( $origimg , $w , $h );
imagejpeg ( $img , $newimg );
imagedestroy ( $img );
>elseif( strtolower ( $extension == ‘.gif’ )) <
$img = $this -> resize_imagegif ( $origimg , $w , $h );
imagegif ( $img , $newimg );
imagedestroy ( $img );
>

Читайте также:  Graveyard keeper зачем нужна история

>
/**
* End function name : resize_img
*/

/**
* Function name : resize_imagepng
* Description : This function is to resize png image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagepng ( $file , $w , $h ) <
list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefrompng ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagepng
*/

/**
* Function name : resize_imagejpeg
* Description : This function is to resize jpeg image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagejpeg ( $file , $w , $h ) <
list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefromjpeg ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagejpeg
*/

/**
* Function name : resize_imagegif
* Description : This function is to resize gif image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagegif ( $file , $w , $h ) <
list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefromgif ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagegif
*/
>
/**
* End class name : resizeImage
*/
?>

This is an example of black-and-white imagebmp() implementation.

/**
* Output a black-and-white BMP image to either the browser or a file.
*
* @param resource $image
* An image resource, returned by one of the image creation functions,
* such as imagecreatetruecolor().
*
* @param string|null $to
* The path or an open stream resource
* (which is automatically being closed after this function returns)
* to save the file to.
* If not set or NULL, the raw image stream will be outputted directly.
*
* @param float $threshold
* The number in the range of 0.0 to 1.0.
* Brighter for larger, or darker for smaller.
*
* @return bool Returns TRUE on success or FALSE on failure.
*
*/
function imagebwbmp ( $image , $to = null , $threshold = 0.5 )
<
if ( func_num_args () 1 ) <
$fmt = "imagebwbmp() expects a least 1 parameters, %d given" ;
trigger_error ( sprintf ( $fmt , func_num_args ()), E_USER_WARNING );
return;
>
if (! is_resource ( $image )) <
$fmt = "imagebwbmp() expects parameter 1 to be resource, %s given" ;
trigger_error ( sprintf ( $fmt , gettype ( $image )), E_USER_WARNING );
return;
>
if (! is_numeric ( $threshold )) <
$fmt = "imagebwbmp() expects parameter 3 to be float, %s given" ;
trigger_error ( sprintf ( $fmt , gettype ( $threshold )), E_USER_WARNING );
return;
>

if ( get_resource_type ( $image ) !== ‘gd’ ) <
$msg = "imagebwbmp(): supplied resource is not a valid gd resource" ;
trigger_error ( $msg , E_USER_WARNING );
return false ;
>
switch ( true ) <
case $to === null :
break;
case is_resource ( $to ) && get_resource_type ( $to ) === ‘stream’ :
case is_string ( $to ) && $to = fopen ( $to , ‘wb’ ):
if ( preg_match ( ‘/[waxc+]/’ , stream_get_meta_data ( $to )[ ‘mode’ ])) <
break;
>
default:
$msg = "imagebwbmp(): Invalid 2nd parameter, it must a writable filename or a writable stream" ;
trigger_error ( $msg , E_USER_WARNING );
return false ;
>

if ( $to === null ) <
$to = fopen ( ‘php://output’ , ‘wb’ );
>

$biWidth = imagesx ( $image );
$biHeight = imagesy ( $image );
$biSizeImage = ((int) ceil ( $biWidth / 32 ) * 32 / 8 * $biHeight );
$bfOffBits = 54 + 4 * 2 ; // Use two colors (black and white)
$bfSize = $bfOffBits + $biSizeImage ;

fwrite ( $to , ‘BM’ );
fwrite ( $to , pack ( ‘VvvV’ , $bfSize , 0 , 0 , $bfOffBits ));
fwrite ( $to , pack ( ‘VVVvvVVVVVV’ , 40 , $biWidth , $biHeight , 1 , 1 , 0 , $biSizeImage , 0 , 0 , 0 , 0 ));
fwrite ( $to , "xffxffxffx00" ); // white
fwrite ( $to , "x00x00x00x00" ); // black

for ( $y = $biHeight — 1 ; $y >= 0 ; — $y ) <
$byte = 0 ;
for ( $x = 0 ; $x $biWidth ; ++ $x ) <
$rgb = imagecolorsforindex ( $image , imagecolorat ( $image , $x , $y ));
$value = ( 0.299 * $rgb [ ‘red’ ] + 0.587 * $rgb [ ‘green’ ] + 0.114 * $rgb [ ‘blue’ ]) / 0xff ;
$color = (int)( $value > $threshold );
$byte = ( $byte 1 ) | $color ;
if ( $x % 8 === 7 ) <
fwrite ( $to , pack ( ‘C’ , $byte ));
$byte = 0 ;
>
>
if ( $x % 8 ) <
fwrite ( $to , pack ( ‘C’ , $byte 8 — $x % 8 )));
>
if ( $x % 32 ) <
fwrite ( $to , str_repeat ( "x00" , (int)(( 32 — $x % 32 ) / 8 )));
>
>

Эта статья рассчитано на программистов со средним уровнем знания PHP.
Введение

PHP не только идеально подходит для вывода HTML страниц, но также включает в себя мощные средства создания изображений "на лету". Приведу лишь несколько примеров:

* Создание кнопок с надписями, текст которых хранится в базе данных
* Графическое отображение статистических данных
* Создание различных графиков и диаграмм

В этой статье рассматривается использование библиотеки GD для обработки изображений. GD является внешней библиотекой, доступной в виде модуля PHP

Цель этой статьи

В статье освещаются следующие вопросы:

* Что такое заголовки (headers)
* Использование функций библиотеки GD для динамического создания изображений средствами PHP
* Использование HTTP заголовков для указания браузеру, что вывод PHP-скрипта представляет собой изображение

Создание заголовка

По умолчанию, PHP выводит один заголовок: Content-type: text/html, означающий, что результатом работы скрипта является HTML код

Как видите, PHP выводит Content-type: text/html и пустую строку, прежде чем выводить результат работы скрипта . Все до пустой строки является заголовком HTTP. Заголовок содержит информацию для браузера и не отображается на экране.

Используемый по умолчанию заголовок Content-type: text/html показывает, что выводится HTML код, который браузер должен обработать. Если изменить его скажем на Content-type: text/plain, то браузер будет воспринимать документ просто как текст и выводить его "как есть" Для вывода заголовков в PHP используется функция header().

Конечно, послать заголовок недостаточно, нужно еще и позаботиться о том, чтобы вывести данные в нужном формате. Не следует думать, что, просто послав заголовок Content-type: application/zip и выведя "Всем привет", вы сможете открыть результат работы такого скрипта с помощью WinZip’а.

Примечание Web-сервер перед отправкой данных клиенту может добавлять и другие заголовки помимо Content-type, их рассмотрение выходит за рамки данной статьи.

Что нам потребуется

Создание изображений в PHP требует наличия библиотеки GD написанной Thomas Boutell . (http://www.boutell.com/gd) Поддержка этой библиотеки включается при компиляции PHP с опцией —with-gd. Для работы с TrueType шрифтами также может понадобиться библиотека FreeType (http://www.freetype.org). Установка обеих библиотек подробно описана в соответствующей документации.

Создаем изображения

Генерация изображения состоит из трех основных этапов:

* Создание изображения
* Отрисовка изображения
* Вывод полученной картинки в браузер

Для создания изображения используется функция ImageCreate(). В качестве аргументов функция принимает ширину и высоту изображения в пикселах и возвращает идентификатор, который в дальнейшем используется при вызове функция для работы с изображением.

Читайте также:  Entity framework 6 code first

Перед тем, как что-либо рисовать, необходимо зарегистрировать цвета, которые вы собираетесь использовать. Для этого предназначена функция ImageColorAllocate(). Этой функции передаются идентификатор изображения и три числа, задающие цвет (RGB — red, green, blue). Функция возвращает идентификатор цвета, который используется в последующих операциях отрисовки изображения.
Пример:

Существует большое количество функций отрисовки изображений. Полное их рассмотрение выходит за рамки данной статьи. Для ознакомления с этими функциями, обратитесь к руководству по PHP.

И, наконец, вывод изображения осуществляется вызовом функции ImagePNG() или ImageGIF(). Последняя не поддерживается в текущей версии GD из-за проблем с лицензированием (разработчики GD обещают возобновить поддержку формата GIF после 7 июля 2004 года, когда истечет срок действия патентов Unisys на алгоритм сжатия LZW, используемый в GIF. Уже после написания этой статьи в библиотеку была включена поддержка форматов JPEG и WBMP. -прим. переводчика). ImagePNG() преобразует внутреннее представление изображения в PNG файл и посылает его клиенту. Аналогично работает и ImageGIF(), но используя формат GIF. Перед использованием функций ImagePNG() или ImageGIF() необходимо послать соответствующий заголовок Content-type
Формат Заголовок
PNG "Content-type: image/png"
GIF "Content-type: image/gif"

Примечание Заголовки относятся ко всему документу. То есть если вы послали заголовок, показывающий, что вы выводите изображение, вы не можете выводить текст. А после того, как вы вывели первый байт данных, заголовок уже нельзя изменить! Это значит, что сначала нужно вызвать header() и только затем начинать вывод данных, иначе вы получите сообщение об ошибке. Если вы не посылаете заголовок Content-type, PHP автоматически посылает Content-type: text/html как только вы начинаете вывод данных.

Как это выглядит на практике

Практическое использование функций библиотеки GD мы рассмотрим на примере скрипта, строящего график биоритмов. По ходу изложения будем приводить выдержки из кода скрипта, который полностью приведен в конце статьи.

Теория биоритмов гласит, что эмоциональная, физическая и интеллектуальная активность каждого человека циклически изменяются с определенными интервалами. В момент рождения, все три кривые выходят из нулевой точки и изменяются в течение всей жизни. Если кривая проходит выше нулевой отметки — это активная фаза, ниже — пассивная. Момент пересечения нулевой отметки означает критический день: вы подвержены риску эмоциональной, физической или интеллектуальной "катастрофы". А в тот день, когда все три кривые проходят через ноль, лучше вообще воздержаться от работы над важными PHP проектами.

У каждой кривой собственный цикл:

* Физическая: 23 дня
* Эмоциональная: 28 дней
* Интеллектуальная: 33 дня

Кривые представляют собой синусоиды, поэтому для вычисления значений биоритмов мы можем воспользоваться встроенной функцией sin()

Установка даты рождения

Сначала мы должны получить дату рождения и вычислить, сколько дней человек прожил до текущей даты. Результат будет использован для вычисления текущей фазы биоритма.

* Проверяем, была ли введена дата рождения.
* Если нет, отображаем форму для ввода даты
* После проверки правильности ввода вычисляем сколько дней человек прожил до текущей даты используя юлианский календарь.

Совет Для вычисления мы используем юлианский календарь. Дата рождения и текущая дата переводятся в количество дней по юлианскому календарю. Разность этих двух чисел дает искомый результат.

Примечание В этом примере функция gregorianToJD() реализована на PHP (см. полный код скрипта ниже). Вообще-то, эта функция реализована в календарном модуле PHP, но на момент написания этой статьи эта функция работала некорректно в последней версии PHP. Поэтому была использована "самодельная" функция. Если в вашем PHP включена поддержка функций работы с календарем, вам нужно удалить определение этой функции из кода в примере.

Подготовка изображения

Порядок действий Подготовка к рисованию состоит из вызова нескольких функций GD. Следующий участок кода:

* Создает изображение нужных размеров.
* Регистрирует используемые цвета.
* Очищает изображения, заливая его цветом фона

Совет Перед началом отрисовки изображения залейте его цветом фона. Это гарантирует, что фон изображения будет того цвета, что вам нужен. Это также полезно для создания прозрачного фона, как будет показано далее.

Примечание Для простоты изложения, примеры в этой статье не содержат проверок ошибок. "Настоящий" скрипт обязательно должен включать проверки на ошибки

Рисуем рамку и выводим текст

Функция ImageString() рисует строку текста на изображении в заданном месте. Нам необходимо вывести пять строк Первые две будут находиться в верхней части рисунка и отображать дату рождения и текущую дату, остальные три под графиком будут показывать, каким цветом какой биоритм изображен. Использование идентификаторов цветов, записанных в переменные, позволяет ссылаться на цвета, не указывая каждый раз RGB значения.

* Рисуем рамку, внутри которой будет размещен график, и оси
* Выводим текст примечаний

Рисунок 1. График биоритмов

Рисуем кривые

Графики биоритмов представляют собой синусоиды, отличающиеся только периодом, поэтому мы определяем функцию drawRythm() , которая отображает синусоиду с заданным периодом. Эта функция будет вычислять значения биоритмов для каждого дня в заданном периоде и соединять полученные точки линиями.

* Функция drawRhythm вызывается три раза с различными параметрами
* Функция drawRhythm содержит цикл, который вычисляет значение биоритма для каждого дня, и рисует линии.

Совет Для получения более плавной кривой следовало бы при вычислениях использовать интервалы меньшие чем один день, однако для целей этой статьи полученного качества изображения вполне достаточно.

Вывод изображения клиенту

Итак, мы нарисовали наш график. Теперь остается отправить это изображение в браузер.

* Посылаем заголовок, показывающий что мы выводим изображение в формате GIF или PNG.
* Определяем чересстрочный формат вывода изображения.
* Делаем цвет фона прозрачным.
* Используя функцию imageGIF или imagePNG выводим изображение.

Совет После вызова imageGIF или imagePNG, изменения в изображение вносить уже нельзя, так как оно уже было отправлено клиенту.

Использование ImageInterlace() позволяет задать режим чересстрочного или прогрессивного вывода изображения (если используемый формат изображения позволяет это). Этот режим интересен тем, что позволяет браузеру начать отображение картинки еще до ее полной загрузки. Сначала выводится изображение с низким качеством, которое улучшается по мере загрузки данных. Это незаменимо при передаче больших изображений по низкоскоростным каналам.

Функция ImageColorTransparent() задает цвет прозрачных участков изображения (опять же, если используемый формат позволяет это). В нашем примере мы используем цвет, сохраненный в переменной $colorBackgr, делая участки изображения, нарисованные этим цветом, прозрачными.
Как использовать полученное изображение

Итак, мы написали программу, создающую изображение. Как ее использовать? На самом деле все очень просто: Вы можете использовать скрипт в HTML коде как обычный файл изображения. Поскольку скрипт в нашем примере является интерактивным, то для его использования нам нужно ввести http://my.server.net/script.php в адресную строку браузера. Для скрипта, не требующего пользовательского ввода, например получающего информацию из базы данных, просто вставьте в HTML код страницы тэг такого содержания:

Полный код скрипта

Заключение

В данной статье рассмотрены основы создания изображений в PHP с использованием функций графической библиотеки GD. На достаточно сложном примере показано, как можно создавать изображения на основе ввода пользователя. Взяв за основу этот пример, вы сможете создавать изображения для решения ваших конкретных задач.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *