Germany | Finland | Saint Petersburg | Drive

О кодировке цвета в Амиброкер

Опубликовано в AmiBroker

Основной способ кодирования цвета в Амиброкере – это формат 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 
colorCustom2 = 1 
colorCustom3 = 2 
colorCustom4 = 3 
colorCustom5 = 4 
colorCustom6 = 5 
colorCustom7 = 6 
colorCustom8 = 7 
colorCustom9 = 8 
colorCustom10 = 9 
colorCustom11 = 10 
colorCustom12 = 11 
colorCustom13 = 12 
colorCustom14 = 13 
colorCustom15 = 14 
colorCustom16 = 15

colorBlack = 16 
colorBrown = 17 
colorDarkOliveGreen = 18 
colorDarkGreen = 19 
colorDarkTeal = 20 
colorDarkBlue = 21 
colorIndigo = 22 
colorDarkGrey = 23

colorDarkRed = 24
colorOrange = 25 
colorDarkYellow = 26 
colorGreen = 27 
colorTeal = 28 
colorBlue = 29 
colorBlueGrey = 30 
colorGrey40 = 31

colorRed = 32 
colorLightOrange = 33 
colorLime = 34 
colorSeaGreen = 35 
colorAqua = 35 
colorLightBlue = 37 
colorViolet = 38 
colorGrey50 = 39

colorPink = 40
colorGold = 41 
colorYellow = 42 
colorBrightGreen = 43 
colorTurquoise = 44 
colorSkyblue = 45 
colorPlum = 46 
colorLightGrey = 47

colorRose = 48
colorTan = 49 
colorLightYellow = 50 
colorPaleGreen = 51 
colorPaleTurquoise = 52 
colorPaleBlue = 53 
colorLavender = 54 
colorWhite = 55 

Вот что получается. Первые 56 цветов палитры (с 0 до 55) Амиброкер транслирует особым образом, преобразуя их в стандартные цвета палитры. Например, цвет с кодом 16 преобразуется в черный, 17 – в коричневый, 48 – в розовый.  Начиная с 56 цвета трансляция прекращается.

А что будет, если задать функции colorRGB все три цветовые составляющие, равные 0? Мы же должны получить абсолютно черный цвет с кодом 0?

_trace(""+colorRGB(0,0,0));

А нет. Результат: 56. Амиброкер при задании RGB цветов со значениями менее 56 заменяет их все на цвет с кодом 56. Зрительно они не отличаются.

 


См. также 

  1. Альтернативный способ выбора цвета в Amibroker
  2. Как сгенерировать случайный цвет на QPILE?
  3. Плагин для работы с цветами в Notepad++
Комментарии   
# admin 23.12.2013 12:09
Вдогонку функция для выбора foreground цвета, максимально четко видимого на любом фоне

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;
}
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий