О кодировке цвета в Амиброкер
Основной способ кодирования цвета в Амиброкере – это формат RGB. Это 24-битная маска, каждые 8 бит которой отвечают за красный (Red), зелёный (Green) и синий (Blue) цвета. Каждый цвет может иметь до 256 градаций яркости (от 0 до 255). Соответственно всего цветов может быть 256*256*256 = 16777216. Младшие 8 битов отвечают за красный цвет, старшие 8 – за голубой. Одним словом, стандартная RGB модель, полное описание которой можно посмотреть, например, на Википедии.
Для задания цвета в RGB модели имеется встроенная функция colorRGB(Red,Green,Blue)
Например, colorRGB(0,255,0) даст число 0x00FF00 (или 65280) - чистый зелёный цвет, colorRGB(255,255,255) – 0xFFFFFF, что есть смешение всех цветов максимальной яркости - белый цвет.
Дополнительно цвет можно задать в виде HSB модели, которая самим амиброкером автоматически преобразуется к RGB модели.
Зачем я все это здесь пишу? Не все так просто, как хотелось бы, есть особенность. Проведём эксперимент. Напишем простейший скрипт:
SetBarsRequired(sbrAll,sbrAll); Plot( 1000, "", BarIndex(), styleNoTitle | styleArea | styleNoRescale); Plot( BarIndex(), "Номер", BarIndex());
Этот скрипт раскрашивает график столбиками разного цвета. Первый столбик рисуется цветом 0, второй – цветом 1, третий цветом 3. Что мы ожидаем увидеть?
Цвет 0 в модели RGB есть черный. В нем все составляющие имеют нулевую яркость. То есть первый столбик должен быть черного цвета. Цвет 1 есть практически то же самое, но у него составляющая красного цвета уже чуть-чуть отлична от нуля. Цвет 2 имеет еще чуть-чуть бОльшую составляющую красного цвета, но тоже очень малую. Логично ожидать, что первые 256 столбиков (с 0 до 255) будут представлять палитру от абсолютно черной до ярко красного. 256 столбик должен быть снова почти черным – в нем единичная яркость красного и такая же малая яркость зелёного. Далее снова будет переход от темного к красному, но уже с маленькой примесью зелёного и далее снова по циклу.
Посмотрим на график, отмотав его в самое начало. Не тут-то было - совсем иная картинка! В самом начале мы видим расписную зебру. Откуда такое чудо?
Сожмём график. Становится понятнее.
Разгадка такова. Первые 56 цветов в палитре RGB очень тёмные и на экране практически неразличимы. Они все черные. Вот их-то Амиброкер использует своим особым образом.
Часть основных цветов в Амиброкере можно задать явно. Они описаны в документации:
colorCustom1 = 0 |
colorBlack = 16 |
colorDarkRed = 24 |
colorRed = 32 |
colorPink = 40 |
colorRose = 48 |
Вот что получается. Первые 56 цветов палитры (с 0 до 55) Амиброкер транслирует особым образом, преобразуя их в стандартные цвета палитры. Например, цвет с кодом 16 преобразуется в черный, 17 – в коричневый, 48 – в розовый. Начиная с 56 цвета трансляция прекращается.
А что будет, если задать функции colorRGB все три цветовые составляющие, равные 0? Мы же должны получить абсолютно черный цвет с кодом 0?
_trace(""+colorRGB(0,0,0));
А нет. Результат: 56. Амиброкер при задании RGB цветов со значениями менее 56 заменяет их все на цвет с кодом 56. Зрительно они не отличаются.
См. также
dnl Возвращает чёрный или белый цвет, противоположный по яркости заданному в формате RGB
function InvertRGB(Color)
{ switch(Color)
{ case 0 :
case 1 :
case 3 :
case 4 :
case 6 :
case 11 :
case 12 :
case 15 :
case 16 :
case 17 :
case 18 :
case 19 :
case 20 :
case 21 :
case 22 :
case 23 :
case 24 :
case 26 :
case 27 :
case 28 :
case 29 :
case 30 :
case 31 :
case 32 :
case 37 :
case 38 :
case 39 :
case 46 :
case 53 : Color = colorWhite;
break;
case 2 :
case 5 :
case 7 :
case 8 :
case 9 :
case 10 :
case 13 :
case 14 :
case 25 :
case 33 :
case 34 :
case 35 :
case 36 :
case 40 :
case 41 :
case 42 :
case 43 :
case 44 :
case 45 :
case 47 :
case 48 :
case 49 :
case 50 :
case 51 :
case 52 :
case 54 :
case 55 : Color = colorBlack;
break;
default : pushdef(`B',floor(Color / eval(0x10000)))
pushdef(`G',floor(Color / 256) % 256)
pushdef(`R',Color % 256)
if (0.3 * R + 0.59 * G + 0.11 * B > 127)
Color = colorBlack;
else
Color = colorWhite;
popdef(`R') popdef(`G') popdef(`B')
}
return Color;
}
RSS лента комментариев этой записи