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


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

17.2.2. Определение параметров изображения

17.2.2.1. Считывание размера изображения: GetlmageSize

array getimagesize (string filename [, array imageinfo])

Функция пытается определить размер переданного ей по имени файла изображения в форматах GIF, JPG, PNG или SWF и возвращает массив, содержащий тип графического файла, а также его ширину и высоту в виде текстовой строки, пригодной для помещения внутрь тега IMG.

Массив результатов содержит четыре элемента, индексируемых числами:
0      Ширина изображения в пикселах
1      Высота картинки в пикселах
2      Флаг, определяющий тип графического файла (может принимать значения:
        1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF)
3      Текстовая строка вида height=xxx width=xxx, которая и предназначена для включения в тег IMG
Вот как эта функция используется на практике:
<?php $size = GetlmageSize ("img/flag.jpg"); ?>
<IMG SRC="img/flag.jpg" <?php echo $s1ze[3]; ?>

?php $size =
          GetlmageSize ("http://www.php.net/gifs/logo.gif");
?>

Если, паче чаяния, вы применяете эту функцию к JPEG-файлам, результирующий массив будет содержать два дополнительных элемента, определяющих количество каналов и разрядность в битах. Первый из них, с индексом 4, имеет значение 3 для изображений RGB и 4 — для картинок, представленных в CMYK. Разрядность, как и следовало ожидать, равна количеству битов, выделяемых для представления каждого цвета.

В случае если доступ к файлу, указанному аргументом filename, получить не удается, функция возвращает вместо массива NULL и генерирует предупреждение.

Использование необязательного аргумента imagei nf о позволяет извлечь из файла картинки некоторую дополнительную информацию. На сегодняшний день эта информация ограничена маркерами JPG АРР, которые помещаются в ассоциативный массив. Чаще всего эта информация помещается в маркер АРР13 (см. http:// www.iptc.org/), и для ее последующего анализа необходимо воспользоваться функцией iptcparse():

<?php
       $size = GetImageSize ("testimg. jpg" ,&$info) ;
       if (isset ($info["APP13"] )) {
          $iptc = iptcparse ($info ["APP13"] ) ;
          var_dump ($iptc) ;

17.2.2.2. Ширина изображения: ImageSX

int imagesx (int im) Функция возвращает ширину изображения im.

17.2.2.3. Высота изображения: ImageSY

int imagesy (int im) Функция ImageSY () возвращает высоту изображения im.

17.2.2.4. Типы изображений: ImageTypes

int imagetypes ()

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

IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP Так, для проверки на предмет наличия поддержки PNG-формата, вам потребуется выполнить следующие операции:
<?рhр
if (ImageTypes() & IMG_PNG) {
       echo "Поддержка PNG включена";
       }
       ?>

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

<HTML>
<ТIТLЕ>Список поддерживаемых форматов картинок</ТIТLЕ>
<?php
$types = ImageTypes();
?>
<h2>B этой PHP-машине поддерживаются:</h2>
<ul type="square">

<? if ($types & IMG_GIF) { ?> <li>СIF-формат - редкая удача!<? }
       if ($types & IMG_PNG) { ?> <li>РNG-формат <? }
       if ($types & IMG_JPG) { ?> <li> JPEG-формат <? }
       if ($types & IMG_WBMP) { ?> <li >ВМР-формат <? }
?>
</ul></html>
Результат ее выполнения представлен на рис. 17.1.

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

17.2.2.5. Считывание EXIF-заголовков: read_exif_data

array read_exif_data (string filename)

Функция read_exif_data() выполняет считывание заголовков EXIF, содержащихся в JPEG-файле, и возвращает ассоциативный массив, ключами которого являются имена заголовков EXIF, а значениями, как и следовало ожидать, — значения этих заголовков. Как правило, эти заголовки присутствуют в файлах, созданных цифровыми камерами, но каждый производитель камер имеет свое собственное представление о составе и формате информации, помещаемой в эти заголовки. В результате не очень-то рассчитывайте на совместимость и переносимость информации.

Для считывания EXIF-заголовков можно воспользоваться вот таким фрагментом кода:
<?php
       $exif = read_exif_data ('p00018Q7.jpg');
       while(list($k,$v)=each($exif)) {
          echo "$k: $v<br>\n";
       }
?>

Поскольку сам я цифровых камер не люблю и предпочитаю обычную 35-миллиметровую пленку, то результаты контрольного примера я позаимствовал из документации к РНР. Вот как может выглядеть результат работы приведенного выше фрагмента:

FileName: p0001807.jpg
FileDateTime: 929353056
FileSize: 378599
CameraMake: Eastman Kodak Company
CameraModel: KODAK DC265 ZOOM DIGITAL CAMERA (V01.00)
Dateline: 1999:06:14 01:37:36
Height: 1024
Width: 1536
IsColor: 1
FlashUsed: 0
FocalLength: 8.0mm
RawFocalLength: 8 ExposureTime: 0.004 s (1/250)
RawExposureTime: 0.0040000001899898
ApertureFNumber: f/ 9.5
RawApertureFNumber: 9.5100002288818
FocusDistance: 16.66m
RawFocusDistance: 16.659999847412
Orientation: 1
ExifVersion: 0200

совет
       Для того чтобы эта функция работала, вы должны скомпилировать РНР с ключом --enable- exif. Но зато для работы этой функции библиотека GD не нужна.

17.2.3. Операции с изображением

17.2.3.1. Яркостная коррекция: ImageGammaCorrect

int imagegammacorrect (int im, double inputgamma, double outputgamma) Функция предназначена для тотальной коррекции яркости всего изображения целиком. При этом должны быть заданы идентификатор изображения im, а также входное и выходное значения параметра яркости. Как правило, входное значение принимается за исходное, равное 1.0.

Чтобы понять, как эта функция работает, составим небольшой HTML-файл (листинг 17.1).

Листинг 17.1. Демонстрация яркостной коррекции: HTML-код
<html>
<ti11е>Демонстрация работы яркостной коррекции в PHP/GD</title>
<body bgcolor="#FFFFFF">
<font size=+l>

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

<table border=2>
<tr><th>Исходное изображение</th><th>Gamma=0. 5</th>
<th>gamma=2 .5

<tr>
<td><img src="fakir.png" width=250></td>
<td><img src="gamma.php?gamma=0.5" width=250></td>
<td><img src="gamma.php?gamma=2.5" width=250></td>
</tr>
</table>
Сайт управляется системой uCoz

Как видите из листинга 17.1, мы выводим в таблице три изображения: исходную картинку, а также два результата синтеза изображения с помощью РНР-сценария. Кстати, его код приведен в листинге 17.2.

Листинг 17.2. Демонстрация яркостной коррекции: программа gamma.php <?php

// настройка гамма-коэффициента
     $gamma = $gamma ? $gamma : 1.0;

// Приступаем к генерации картинки
$image = ImageCreateFromPNGC'f akir.png");

// Корректируем гамма-показатель
$r = ImageGammaCorrect($image,I.Q.$gamma);

header("Content-type: image/png");

// Включаем режим чересстрочной генерации изображения
Ifflagelnterlace($image, 1):
// и отправляем картинку на машину клиента
imagepng($image);
?>

Как видите, мы используем в качестве входной оценки яркости число 1,0 -тем самым мы указываем, что яркость исходной картинки, загруженной из файла, принимается за 1. Эта программа вызывается с двумя показателями яркости, 0,5 и 2,5. Результат обработки представлен на рис. 17.2.

Рис. 17.2. С помощью РНР вы можете динамически регулировать яркость любого изображения

17.2.3.2. Копирование изображений: ImageCopy

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

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

Понятно, что вы можете производить копирование и в пределах одной и той же картинки.

Для демонстрации работы этой функции воспользуемся HTML-файлом, приведенным в листинге 17.3, и соответствующей программой на РНР (листинг 17.4).

Листинг 17.3. Демонстрация работы функции копирования: HTML-код <html>
<tit1е>Демонстрация работы функции копирования PHP/GD</title>
<body bgcolor="#FFFFFF">
<font size=+l>

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

<table border=2>
<tr><th>Исходное изображение</th><th>Преобразованное</th><Аг>

<tr>
<td><img src="fakir.png" width=350></td>
<td><img src="copy.php" width=350></td>
</tr>
</table>
Сайт управляется системой uCoz

Листинг 17.4. Демонстрация работы функции копирования: программа copy.php <?php
// copy.php - преобразование изображения
//                              в мозаичную картинку

// Загружаем исходную картинку
$imold = imageCreateFromPNGC'fakir . png") ;
// считываем ее размеры
$size = getImageSize("fakir.png");

$w = $size[0] ; $h = $size[l];
Simage = imageCreate($w,$h);
// Размеры нарезки
$dw = $w / 4; $dh = $h/4;
for ($i = 0; $i <4; $i++) {
       for ($j = 0; $j<4; $]++) {
          // координаты начального фрагмента
          $xst = $dw*$i: $yst = $dh*$j:
          // координаты целевого фрагмента
          $xdst = $dw*(3-$i); $ydst = $dh*(3-$j);
          // Теперь копируем фрагментик
          ImageCopy($image,$imold, $xdst, $ydst,
                    $xst, $yst, $dw, $dh);
header("Content-type: image/png") ;

// Включаем режим чересстрочной генерации изображения
imageInterlace($image, 1);
// и отправляем картинку на машину клиента
imagepng($image) ;
?>
Результат выполнения программы представлен на рис. 17.3.

Рис. 17.3. Копирование фрагментов изображения может использоваться для получения интересных визуальных эффектов
назад
далее

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