Получение ближайшего цвета
Давайте разберемся, зачем это придумана такая технология [E96][DK97] работы с цветами через промежуточное звено — идентификатор цвета. А дело все в том, что некоторые форматы изображений (такие как GIF и частично PNG) не поддерживают любое количество различных цветов в изображении. А именно, в GIF количество одновременно присутствующих цветов ограничено цифрой 256, причем чем меньше цветов используется в рисунке, тем лучше он "сжимается"
и тем меньший размер имеет файл. Тот набор цветов, который реально использован в рисунке, называется его палитрой.
Представим себе, что произойдет, если все 256 цветов уже "заняты"
и вызывается функция imageColorAllocate(). В этом случае она обнаружит, что палитра заполнена полностью, и найдет среди занятых цветов тот, который ближе всего находится к запрошенному — будет возвращен именно его идентификатор. Если же "свободные места"
в палитре есть, то они и будут использованы этой функцией (конечно, если в палитре вдруг не найдется точно такой же цвет, как запрошенный — обычно дублирование одинаковых цветов всячески избегается).
int imageColorClosest(int $im, int $red, int $green, int $blue)
Наверное, вы уже догадались, зачем нужна функция imageColorClosest(). Вместо того чтобы пытаться выискать свободное место в палитре цветов, она просто возвращает идентификатор цвета, уже существующего в рисунке и находящегося ближе всего к затребованному. Таким образом, нового цвета в палитру не добавляется. Если палитра невелика, то функция может вернуть не совсем тот цвет, который вы ожидаете. Например, в палитре из трех цветов "красный-зеленый-синий"
на запрос желтого цвета будет, скорее всего, возвращен идентификатор зеленого — он "ближе всего"
с точки зрения GD соответствует понятию "зеленый".