| |
после
рассмотрения функции imageColorClosest().
Получение ближайшего цвета
Давайте разберемся, зачем это придумана такая технология работы с цветами через
промежуточное звено — идентификатор цвета. А дело все в том, что некоторые фор-
маты изображений (такие как GIF и частично PNG) не поддерживают любое количе-
Глава 23. Работа с изображениями 321
ство различных цветов в изображении. А именно, в GIF количество одновременно
присутствующих цветов ограничено цифрой 256, причем чем меньше цветов исполь-
зуется в рисунке, тем лучше он "сжимается" и тем меньший размер имеет файл. Тот
набор цветов, который реально использован в рисунке, называется его палитрой.
Представим себе, что произойдет, если все 256 цветов уже "заняты" и вызывается
функция imageColorAllocate(). В этом случае она обнаружит, что палитра запол-
нена полностью, и найдет среди занятых цветов тот, который ближе всего
находится
к запрошенному — будет возвращен именно его идентификатор. Если же "свободные
места" в палитре есть, то они и будут использованы этой функцией (конечно, если
в
палитре вдруг не найдется точно такой же цвет, как запрошенный — обычно дубли-
рование одинаковых цветов всячески избегается).
int imageColorClosest(int $im, int $red, int $green, int $blue)
Наверное, вы уже догадались, зачем нужна функция imageColorClosest(). Вместо
того чтобы пытаться выискать свободное место в палитре цветов, она просто
возвра-
щает идентификатор цвета, уже существующего в рисунке и находящегося ближе все-
го к затребованному. Таким образом, нового цвета в палитру не добавляется. Если
палитра невелика, то функция может вернуть не совсем тот цвет, который вы
ожидае-
те. Например, в палитре из трех цветов "красный-зеленый-синий" на запрос
желтого
цвета будет, скорее всего, возвращен идентификатор зеленого — он "ближе всего"
с
точки зрения GD соответствует понятию "зеленый".
Эффект прозрачности
Функцию imageColorClosest() можно и нужно использовать, если мы не хотим
допустить разрастания палитры и уверены, что требуемый цвет в ней уже есть.
Одна-
ко есть и другое, гораздо более важное, ее применение — определение эффекта
про-
зрачности для изображения. "Прозрачный" цвет рисунка — это просто те точки, ко-
торые в браузер не выводятся. Таким образом, через них "просвечивает" фон.
Прозрачный цвет у картинки всегда один, и задается он при помощи функции
imageColorTransparent().
int imageColorTransparent(int $im [,$int col])
Функция imageColorTransparent() указывает GD, что соответствующий цвет
$col (заданный своим идентификатором) в изображении $im должен обозначиться
как прозрачный. Возвращает она идентификатор установленного до этого прозрачно-
го цвета, либо false, если таковой не был определен ранее.
Не все форматы поддерживают задание прозрачного цвета — например, JPEG
не может его содержать.
Например, мы нарисовали при помощи GD птичку на кислотно-зеленом фоне и хо-
тим, чтобы этот фон как раз и был "прозрачным" (вряд ли у птички есть части
тела
Часть IV. Стандартные функции PHP 322
такого цвета, хотя с нашей экологией все может быть...). В этом случае нам
потребу-
ются такие команды:
$tc=imageColorClosest($im,0,255,0);
imageColorTransparent($im,$tc);
Обратите внимание на то, что применение функции imageColorAllocate() здесь
совершенно бессмысленно, потому что нам нужно сделать прозрачным именно тот
цвет, который уже присутствует в изображении, а не новый, только что созданный.
Получение RGB-составляющих
array imageColorsForIndex(int $im, int $index)
Функция возвращает ассоциативный массив с ключами red, green и blue (именно в
таком порядке), которым соответствуют значения, равные величинам компонент RGB
в идентификаторе цвета $index. Впрочем, мы можем и не обращать особого внима-
ния на ключи и преобразовать возвращенное значение как список:
$c=imageColorAt($i,0,0);
list($r,$g,$b)=array_values(imageColorsForIndex($i,$c));
echo "R=$r, g=$g, b=$b";
Эта функция ведет себя противоположно по отношению к imageCollorAllocate()
или imageColorClosest().
Графические примитивы
Здесь мы рассмотрим минимальный набор функций для работы с картинками. При-
веденный список функций не полон и постоянно расширяется вместе с развитием GD.
Но все же он содержит те функции, которые вы будете употреблять в 99% случаев.
За
полным списком функций обращайтесь к документации или на http://ru.php.net.
Копирование изображений
int imageCopyResized(int $dst_im, int $src_im, int $dstX, int $dstY,
int $srcX, int $srcY, int $dstW, int $dstH,
int $srcW, int $sr
|
|