Добавление эффекта объёма для линий индикатора - страница 9

 

Горизонтальный градиент на канвасе.

 

Файлы:
gradient.mq5  5 kb
 

Немного улучшил код, а также ввёл переменную, которая отвечает за скорость визуализации:

input uchar speed=5;             // visible effect

Изменение скорости визуализации сделано благодаря обновлению канваса не после каждого рисования линии, а через промежутки.

Размер промежутка вычисляется при помощи арифметической операции "Остаток от деления":

      if(i%speed==0)
         canvas_.Update()
Файлы:
gradient.mq5  5 kb
 

Я тут накладывал разные цвета: на фоновый цвет полностью непрозрачный (альфа канал 255) накладывал цвет с прозрачностью (альфа канал равен 128). Возник вопрос - по каким формулам считается итоговый цвет пикселя для режимов COLOR_FORMAT_ARGB_RAW и COLOR_FORMAT_ARGB_NORMALIZE.

Если ориентироваться на статью Расчёт результирующего цвета, то расчёты не совпадают. 

Альфа-канал — Википедия
Альфа-канал — Википедия
  • ru.wikipedia.org
В компьютерной графике альфа-композиция обозначает процесс комбинирования изображения с фоном с целью создания эффекта частичной прозрачности. Этот метод часто применяется для многопроходной обработки изображения по частям с последующей комбинацией этих частей в единое двумерное результирующее изображение. Таким образом, альфа канал...
 

Где неправильно: цветовые константы хранят неправильные данные или функция PrintFormat неправильно работает?

Вот скрипт, который выводит через PrintFormat цвета в целочисленном виде:

//+------------------------------------------------------------------+
//|                                                  Script_test.mq5 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- зададим прозрачность
   uchar alfa=0x80; // значение 0x80 означает 128/255=50 % прозрачности   
   //--- выведем преобразование в ARGB для цвета clrBlue
   PrintFormat("0x%.8X - clrBlue",clrBlue);
   PrintFormat("0x%.8X - clrBlue ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrBlue,alfa));
   //--- выведем преобразование в ARGB для цвета clrGreen
   PrintFormat("0x%.8X - clrGreen",clrGreen);
   PrintFormat("0x%.8X - clrGreen ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrGreen,alfa));
   //--- выведем преобразование в ARGB для цвета clrRed
   PrintFormat("0x%.8X - clrRed",clrRed);
   PrintFormat("0x%.8X - clrRed ARGB with alfa=0x0x80 (transparency 50%%)",ColorToARGB(clrRed,alfa));
  }
//+------------------------------------------------------------------+

 

Результат вывода:

2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x80FF0000 - clrRed ARGB with alfa=0x0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x000000FF - clrRed
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x80008000 - clrGreen ARGB with alfa=0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00008000 - clrGreen
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x800000FF - clrBlue ARGB with alfa=0x80 (transparency 50%)
2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00FF0000 - clrBlue

Почему clrRedпредставлен как 0x000000FF, а не как 0x00FF0000? Ведь красный цвет это C'255,0,0'.

Почему clrBlue представлен как 0x00FF0000а не как 0x000000FF? Ведь синий цвет это C'0,0,255'. 

Файлы:
 
Все правильно. Просто у ARGB по сравнению с Color другой формат хранения данных.
 
TheXpert:
Все правильно. Просто у ARGB по сравнению с Color другой формат хранения данных.

Формат записи один должен быть: сначала альфа канал (если он есть) затем RGB. Согласно справке тип Color запись синего цвета через литералы: 

C'0x00,0x00,0xFF' // синий

т.е. в целочисленном представлении синий цвет (без альфа-канал) должен записываться так: 0x0000FF. Но тестовый скрипт выводит синий цвет задом наперёд:

2015.01.24 21:50:31.164 Script_test (GBPUSD,D1) 0x00FF0000 - clrBlue

Получается, что в цветовых константах цвет записан задом наперед. 

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип color
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип color
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип color - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
barabashkakvn:

Получается, что в цветовых константах цвет записан задом наперед. 

Да. Такой порядок в литерале не значит что в Color такой же порядок
 

При COLOR_FORMAT_ARGB_RAW метод TransparentLevelSet с параметром "0" (полная прозрачность) делает прозрачность близкую к полной прозрачности, но явно не полную прозрачность.

Файлы:
 
barabashkakvn:

При COLOR_FORMAT_ARGB_RAW метод TransparentLevelSet с параметром "0" (полная прозрачность) делает прозрачность близкую к полной прозрачности, но явно не полную прозрачность.

Уточнение: остаточная прозрачность при уровне прозрачности "0" наблюдается только на x32. На x64 остаточной прозрачности нет:

x32


x64


Такое поведение канваса в режиме COLOR_FORMAT_ARGB_RAW - ошибка или особенность рисования в системах x32 и x64?

 
barabashkakvn:

Уточнение: остаточная прозрачность при уровне прозрачности "0" наблюдается только на x32. На x64 остаточной прозрачности нет:

Такое поведение канваса в режиме COLOR_FORMAT_ARGB_RAW - ошибка или особенность рисования в системах x32 и x64?

В сервис деск надо... )))