Hinzufügen eines Volumeneffekts zu den Indikatorlinien - Seite 9

 

Horizontaler Farbverlauf auf der Leinwand.

Dateien:
gradient.mq5  5 kb
 

Der Code wurde leicht verbessert und eine Variable eingeführt, die für die Rendering-Geschwindigkeit verantwortlich ist:

input uchar speed=5;             // visible effect

Die Geschwindigkeit der Visualisierung wird geändert, indem die Leinwand nicht nach jedem Zeichnen der Linie, sondern in Intervallen aktualisiert wird.

Die Größe der Lücke wird mit der arithmetischen Operation "Rest der Division" berechnet:

      if(i%speed==0)
         canvas_.Update()
Dateien:
gradient.mq5  5 kb
 

Ich habe hier verschiedene Farben verwendet: Ich habe eine Farbe mit Transparenz (Alphakanal 255) auf die Hintergrundfarbe (Alphakanal 128) angewendet. Ich habe eine Frage: Welche Formel wird zur Berechnung der endgültigen Pixelfarbe für die Modi COLOR_FORMAT_ARGB_RAW und COLOR_FORMAT_ARGB_NORMALIZE verwendet?

Wenn Sie sich auf den Artikel Berechnung der resultierenden Farbe beziehen, stimmen die Berechnungen nicht überein.

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

Wo liegt der Fehler: Speichern die Farbkonstanten die falschen Daten oder funktioniert die Funktion PrintFormat nicht richtig?

Hier ist ein Skript, das Farben in ganzzahliger Form über PrintFormat ausgibt:

//+------------------------------------------------------------------+
//|                                                  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));
  }
//+------------------------------------------------------------------+

Ergebnis der Ausgabe:

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

Warumwird clrRed als0x000000FF und nicht als0x00FF0000dargestellt? Denn Rot ist C'255,0,0'.

Warum wirdclrBlue als0x00FF0000 und nicht als0x0000FF dargestellt? Denn Blau ist C'0,0,255'.

Dateien:
 
Das ist richtig. Es ist nur so, dass ARGB ein anderes Speicherformat hat als Color.
 
TheXpert:
Das ist richtig. Es ist nur so, dass ARGB ein anderes Datenspeicherformat hat als Color.

Das Aufnahmeformat sollte dasselbe sein: zuerst der Alphakanal (falls vorhanden), dann RGB. Je nach Hilfetyp Farbsatz blau durch Literale:

C'0x00,0x00,0xFF'// blau

d.h. in der Integer-Darstellung sollte die blaue Farbe (ohne Alpha-Kanal) wie folgt geschrieben werden: 0x0000FF. Aber das Testskript gibt die blaue Farbe rückwärts aus:

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

Es hat sich herausgestellt, dass die Farbe in den Farbkonstanten rückwärts geschrieben wird.

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

Es hat sich herausgestellt, dass die Farbe in den Farbkonstanten rückwärts geschrieben wird.

Ja. Diese Reihenfolge in der wörtlichen Rede bedeutet nicht die gleiche Reihenfolge in Color
 

Bei COLOR_FORMAT_ARGB_RAW erzeugt dieTransparentLevelSet-Methode mit dem Parameter "0" (volle Transparenz) eine Beinahe-Transparenz, aber eindeutig keine volle Transparenz.

Dateien:
 
barabashkakvn:

Bei COLOR_FORMAT_ARGB_RAW erzeugt die MethodeTransparentLevelSet mit dem Parameter "0" (volle Transparenz) zwar Fast-Transparenz, aber eindeutig keine volle Transparenz.

Klarstellung: Resttransparenz bei Transparenzstufe "0" wird nur bei x32 beobachtet. Auf x64 gibt es keine Resttransparenz:

x32


x64


Ist dieses Kanvas-Verhalten im COLOR_FORMAT_ARGB_RAW-Modus ein Fehler oder eine Eigenschaft des Zeichnens in x32- und x64-Systemen?

 
barabashkakvn:

Klarstellung: Resttransparenz bei Transparenzstufe "0" wird nur bei x32 beobachtet. Auf x64 gibt es keine Resttransparenz:

Ist dieses Kanvas-Verhalten im COLOR_FORMAT_ARGB_RAW-Modus ein Fehler oder eine Eigenschaft des Zeichnens in x32- und x64-Systemen?

Service Desk wird benötigt... )))