インジケーターラインにボリューム効果を付加する - ページ 9

 

キャンバスに水平方向のグラデーションをかける。

ファイル:
gradient.mq5  5 kb
 

コードを少し改良し、レンダリング速度に関わる変数も導入しました。

input uchar speed=5;             // visible effect

可視化の速度を変えるには、線を引くたびにキャンバスを更新するのではなく、間隔を空けて更新することで行っています。

ギャップの大きさは、算術演算「除算の余り」を使って算出します。

      if(i%speed==0)
         canvas_.Update()
ファイル:
gradient.mq5  5 kb
 

ここでは異なる色を適用しています。背景色(アルファチャンネル128)に透明度(アルファチャンネル255)を持つ色を適用しています。COLOR_FORMAT_ARGB_RAWモードとCOLOR_FORMAT_ARGB_NORMALIZEモードの最終的なピクセルカラーを計算するためにどの公式が使用されているかという質問があります。

Calculating resulting colorの 記事を参照すると、計算が合いません。

Альфа-канал — Википедия
Альфа-канал — Википедия
  • 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は0x0000FF0000ではなく0x000000FFと表現さ れるのですか?赤はC'255,0,0'だからです。

clrBlueは なぜ0x0000FFではなく0x00FF0000と 表現されるのですか?青はC'0,0,255'だからです。

ファイル:
 
これは正しい。ただ、ARGBはColorと保存形式が違うだけなんです。
 
TheXpert:
これは正しい。ただ、ARGBはColorと比べるとデータの保存形式が違うんです。

記録形式は同じで、最初にアルファチャンネル(ある場合)、次にRGBの順で記録します。ヘルプによると、タイプ リテラルを介してカラー レコードの青。

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_FORMAT_ARGB_RAWの 場合、TransparentLevelSet メソッドの パラメータを0(完全透明)にすると、ほぼ透明な状態になりますが、明らかに完全透明ではありません。

ファイル:
 
barabashkakvn:

COLOR_FORMAT_ARGB_RAWの 場合、TransparentLevelSet メソッドの パラメータを0(完全透明)にすると、ほぼ透明にはなりますが、明らかに完全透明にはなりません。

明確化:透明度 "0 "での残留透明度は、x32でのみ観察されます。x64では透明度が残らない。

x32


x64


COLOR_FORMAT_ARGB_RAW モードでのこの kanvas の動作は、バグなのか x32 と x64 システムでの描画の特徴なのでしょうか?

 
barabashkakvn:

明確化:透明度 "0 "での残留透明度は、x32でのみ観察されます。x64では透明度が残らない。

COLOR_FORMAT_ARGB_RAW モードでのこの kanvas の動作は、バグなのか x32 と x64 システムでの描画の特徴なのでしょうか?

サービスデスクを募集しています...)))
理由: