PHP-4 Эффективная работа


Установка средств графической поддержки
Функции поддержки работы с графикой
Небольшие графические объекты

17.2.3.3. Копирование со слиянием: ImageCopyMerge

int ImageCopyMerge (resource dst_im, resource src_im,
                                                  int dst_x, int dst_y,
                                                  int src_x, int src_y,
                                                  int src_w, int src_h,
                                                  int pct)

Функция производит копирование фрагмента исходного изображения src_im в dst_im. Фрагмент имеет начальные координаты (src_x, src_y), ширину src_w и высоту s rc_h. Этот фрагмент копируется в выходное изображение в точку (dst_x, dst_y).

Слияние изображений осуществляется в соответствии со значением коэффициента pct, который принимает значение от 0 до 100. Фактически — это доля яркости, которую будет иметь переносимый фрагмент исходного изображения в новом. Если коэффициент равен 0, то никакого наложения и копирования не происходит, а если он равен 100, то функция ведет себя аналогично ImageCopy ().

В листинге 17.5 показано, как можно использовать эту функцию.
Листинг 17.5. Демонстрация работы копирования со слиянием: HTML-код <html>
<ti11е>Демонстрация работы копирования со слиянием</title>

<body bgcolor="#FFFFFF">
<font size=+l>

<hЗ>Дeмoнcтpaция применения ImageCopyMerge()</h3>

<table border=2>
<tr>
       <th>Исходнoe изображениe</th><th>pct=0</th><th>pct=25</th>
</tr>

<tr>
       <td><img src="fakir.png" width=250></td>
       <td><img src="copym.php?pct=0" width=250></td>
       <td><img src="copym.php?pct=25" width=250></td>
</tr>
<tr>
       <th>pct=50</th><th>pct=75</th><th>pct=100</th>
</tr>
<tr>
       <td><img src="copym.php?pct=50" width=250></td>
       <td><img src="copym.php?pct=75" width=250></td>
       <td><img src="copym.php?pct=100" width=250></td>
</tr>

</table>
</body></html>

Использующаяся в файле HTML программа copym.php приведена в листинге 17.6.

Листинг 17.6. Демонстрация работы копирования со слиянием: программа copym.php <?php
// copym.php - копирование изображения со слиянием
$pct = $pct ? $pct : 100; // Коэффициент слияния

// Загружаем исходную картинку
$imold = imageCreateFromPNG("fakir.png");
// считываем ее размеры
$size = getImageS1ze("fakiг.png");
$w = $size[0]; $h = $size[l];
$image = imageCreate($w,$h);
// Заливаем все поле некоторым оттенком синего
$floodColor = ImageColorAllocate($image,0,0,112);
imageFilledRectangle($image, 0, 0, $width - 1, $height - 1, $floodColor);

// вливаем в изображение весь исходный массив данных
ImageCopyMerge($image,$imold, 0, 0, 0, 0, $w, $h,$pct);
header("Content-type: image/png");

// отправляем картинку на машину клиента
imagepng($image);
?>

Результат выполнения этой программы приведен на рис. 17.4. Изображение-приемник представляет собой синий прямоугольник. Обратите внимание на возникающие искажения в режиме «pct=100».


Рис. 17.4. Копирование со слиянием

17.2.3.4. Копирование с масштабированием:ImageCopyResized

int imagecopyresized (resource dst_im, resource src_im,
                                                  int dstX, int dstY,
                                                  int srcX, int srcY,
                                                  int dstW, int dstH,
                                                  int srcW, int srcH)

Функция предназначена для копирования прямоугольного фрагмента изображения из одной картинки в другую. Аргумент dst_im указывает на изображение, являющееся получателем фрагмента, a s rc_i m — на владельца исходного фрагмента. В случае если координаты и размеры исходного и целевого фрагментов различаются, функция автоматически производит все необходимые преобразования масштаба изображения.

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

Для демонстрации эффекта масштабирования можно воспользоваться HTML-файлом, приведенным в листинге 17.7, а также программой copyrs.php (листинг 17.8).

Листинг 17.7. Демонстрации эффекта масштабирования: HTML-код <html>
<tit1е>Демонстрация работы копирования с масштабированием</title>

<body bgcolor="#FFFFFF">
<font size=+l>

<hЗ>Демонстрация применения ImageCopyResized()</h3>

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

<table border=2>
<tr>
       <th1>Исходное изображение</th>
       <th>Растягиваем в ширину</th>
       <th>И сжимаем</th>
</tr>

<tr>
       <td><img src="fakir.png" width=300></td>
       <td><img src="copyrs.php?v=l" width=300></td>
       <td><img src="copyrs.php?v=2" width=300></td>
</tr>
</table>
</body></html>

Листинг 17.8. Демонстрации эффекта масштабирования: программа copyrs.php <?php
// copyrs.php - копирование изображения с масштабированием
$v = $v ? $v : 1; // Вариант преобразования

// Загружаем исходную картинку
$imold = imageCreateFromPNG("f aKi r . png");
// считываем ее размеры
$size = getImageSize("fakir.png");
$w = $size[0] ; $h = $size[l] ;
// Теперь выбираем вариант преобразования
if ($v == 1) { $nw = $w*2; $nh = $h; }
          else { $nw = $w; $nh = $h*2; }

$image = imageCreate($nw,$nh);
// Заливаем все поле некоторым оттенком синего
$floodColor = ImageColorAllocate($image,0,0,112);
imageFilledRectangle($image, 0, О, $width - 1,
                            $height - 1, $floodColor);
// вливаем в изображение весь исходный массив данных
ImageCopyResized($image,$imold, 0, 0, 0, 0, $nw, $nh,
                  $w,$h);
header("Content-type: image/png") ;

// отправляем картинку на машину клиента
imagepng($image) ;

Рис. 17.5. Масштабирование изображения может рассматриваться как разновидность его искажения

Рис. 17.6. Но можно использовать ImageCopyResized и для выделения отдельных интересных фрагментов картинки

Результат выполнения этой программы приведен на рис. 17.5. Можно также использовать эту функцию для получения увеличенных фрагментов картинок, как показано на рис. 17.6. Реализацию этой программы можете рассматривать как небольшое домашнее задание.

17.2.3.5. Уничтожение картинки: ImageDestroy

1nt imagedestroy (int in)

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

17.2.4. Вывод изображения

17.2.4.1. Вывод изображения в формате GIF: ImageGIF

int imagegif (intim [, string filename])

Функция ImageGIF( ) преобразует данные, содержащиеся в изображении imв выходной поток GIF или создает GIF-файл с именем f i lename, если вы используете второй необязательный аргумент filename.

Стоит иметь в виду, что поскольку в последних версиях GD поддержка GIF отсутствует, эта функция может оказаться недоступной, поэтому имеет смысл заменить стандартный вывод изображения:

Header("Content-type: image/gif");
ImageGIF($im);
на следующую конструкцию:
<?php        if (function_exists("imagegif")) {
          Header("Content-type: image/gif");
          ImageGIF($1m);
       }
       elseif (function_exists("imagejpeg")) {
          Header("Content-type: image/jpeg");
          ImageJPEG($im, "", 0.5); // указываем коэффициент сжатия
       }
       elseif (function_exists("imagepng")) {
          Header("Content-type: image/png");
          ImagePNG($im) ;
       }
       elseif (function_exists("imagewbmp")) {
          Header("Content-type: image/vnd.wap.wbmp");
          ImageWBMP($im);
       }
       else
          die("ЭтотT PHP-сервер не работает с картинками!");
?>

Начиная с версии 4.0.2 можно воспользоваться функцией imagetypes( ) (см. раздел 17.2.2.4), которая возвращает битовую маску, в которой перечислены поддерживаемые машиной форматы изображений:

if (ImageTypes( ) & IMG_GIF) {
          Header("Content-type: image/gif");
          ImageGif($im) ;
}
elseif (ImageTypesO & IMG_JPG) {
                  ... и т.д.

17.2.4.2. Вывод изображения в формате PNG:ImagePNG

int imagepng (intim [, string filename])

Функция ImagePNG() формирует выходной поток в формате PNG, который направляется непосредственно в программу-навигатор или, если указан необязательный аргумент filename, в файл с указанным именем.

<?php
$im = ImageCreateFromPng("test .png") ;
ImagePng($im);
?>

17.2.4.3. Вывод изображения в формате JPEG: ImageJPEG

int imagejpeg (int im [, string filename [, int quality]])

Функция ImageJPEG( ) создает JPEG-файл с именем filename из изображения im. Аргумент filename является необязательным. При его отсутствии выходные данные передаются в поток STDOUT, что позволяет непосредственно генерировать изображение в окне программы-клиента. Однако если вы хотите указать коэффициент сжатия изображения quality, необходимо присвоить аргументу filename значение "" (пустую строку). Кроме того, не забудьте сформировать заголовок «i mage/j peg», прежде чем отправлять данные клиенту. Аргумент quality может принимать значения в диапазоне от 0 до 100. Чем выше значение, тем лучше качество изображения и тем больше размер генерируемого файла. По умолчанию значение этого аргумента принимается равным 100.

17.2.4.4. Вывод изображения в BMP-формате: ImageWBMP

int imageWBMP (int im [, string filename])

Функция создает WBMP-Файл с именем filename или направляет поток в STDOUT, если имя файла не указано. При этом вы должны позаботиться об отправке клиенту заголовка «image/ vnd. wap. wbmp».

17.2.4.5. Чересстрочная загрузка: Imagelnterlace

int imageinterlace (int im [, int interlace])

Функция ImageInterlace() устанавливает или сбрасывает бит чересстрочной загрузки изображения. В случае установки этого бита равным 1 загрузка изображения будет производиться в чересстрочном режиме, что позволяет быстрее уловить ее очертания при медленных каналах передачи данных. Если же этот бит равен 0, загрузка осуществляется построчно.

Функция возвращает текущее значение бита чересстрочной развертки.
назад
далее

Сайт управляется системой uCoz