Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 [ 106 ] 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

( Замечание

Не все форматы поддерживают задание прозрачного цвета - например, JPEG

не может его содержать. Например, мы нарисовали при помощи GD птичку на кислотно-зеленом фоне и хотим, чтобы этот фон как раз и был "прозрачным" (вряд ли у птички есть части тела

ство различных цветов в изображении. А именно, в 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, если таковой не был определен ранее.



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

$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 $srcH)

Эта функция - одна из самых мощных и универсальных, хотя и выглядит просто ужасно. С помощью нее можно копировать изображения (или их участки), перемещать и масштабировать их . Пожалуй, 10 параметров для функции - чересчур, но разработчики PHP пошли таким путем. Что же, это их право...

Итак, $dst im задает идентификатор изображения, в который будет помещен результат работы функции. Это изображение должно уже быть создано или загружено и иметь надлежащие размеры. Соответственно, $src im - идентификатор изображе-



Наконец, четверка ($dstx, $dstY, $dstw, $dsi $dst im, в которое будет "втиснут" указанный ник. Заметьте, что, если ширина или высота дву

ния, над которым проводится работа. Впрочем, $src im и $dst im могут и совпадать.

Параметры ($srcx, $srcY, $srcW, $srcH) (обратите внимание на то, что они следуют при вызове функции не подряд!) задают область внутри исходного изображения, над которой будет осуществлена операция - соответственно, координаты ее верхнего левого угла, ширину и высоту.

dstH) задает то место на изображении в пред1дущей четверке прямоуголь-

ник. Заметьте, что, если ширина или высота двух прямоугольников не совпадают, то картинка автоматически будет нужным образом растянута или сжата.

Таким образом, с помощью функции imageCopyResized() мы можем:

□ копировать изображения;

□ копировать участки изображений;

□ масштабировать участки изображений;

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

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

Прямоугольники

int imageFilledRectangle(int $im,int $x1,int $y1,int $x2,int $y2,int $c) Название этой функции говорит за себя: она рисует закрашенный прямоугольник в изображении, заданном идентификатором $im, цветом $col (полученным, например, при помощи функции imageColorAllocate()). Координаты ($x1,$y1) и ($x2,$y2) задают координаты верхнего левого и правого нижнего углов, соответственно (отсчет, как обычно, начинается с левого верхнего угла и идет слева направо и сверху вниз).

Эта функция часто применяется для того, чтобы целиком закрасить только что созданный рисунок, например, прозрачным цветом:

$i=imageCreate(100,100);

$c=imageColorAllocate($i,0,0,0);

imageColorTransparent($i,$c);

imageFilledRectangle($i,0,0,imageSx($i)-1,imageSY($i)-1,$c); дальше работаем с изначально прозрачн1м фоном

int imageRectangle(int $im, int $x1, int $y1, int $x2, int $y2, int $col)

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

imageFilledRectangle() .



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 [ 106 ] 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189