В компьютерной графике альфа-композиция обозначает процесс комбинирования изображения с фоном с целью создания эффекта частичной прозрачности. Этот метод часто применяется для многопроходной обработки изображения по частям с последующей комбинацией этих частей в единое двумерное результирующее изображение. Таким образом, альфа канал...
//+------------------------------------------------------------------+//| Script_test.mq5 |//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- зададим прозрачностьuchar alfa=0x80; // значение 0x80 означает 128/255=50 % прозрачности //--- выведем преобразование в ARGB для цвета clrBluePrintFormat("0x%.8X - clrBlue",clrBlue);
PrintFormat("0x%.8X - clrBlue ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrBlue,alfa));
//--- выведем преобразование в ARGB для цвета clrGreenPrintFormat("0x%.8X - clrGreen",clrGreen);
PrintFormat("0x%.8X - clrGreen ARGB with alfa=0x80 (transparency 50%%)",ColorToARGB(clrGreen,alfa));
//--- выведем преобразование в ARGB для цвета clrRedPrintFormat("0x%.8X - clrRed",clrRed);
PrintFormat("0x%.8X - clrRed ARGB with alfa=0x0x80 (transparency 50%%)",ColorToARGB(clrRed,alfa));
}
//+------------------------------------------------------------------+
キャンバスに水平方向のグラデーションをかける。
コードを少し改良し、レンダリング速度に関わる変数も導入しました。
可視化の速度を変えるには、線を引くたびにキャンバスを更新するのではなく、間隔を空けて更新することで行っています。
ギャップの大きさは、算術演算「除算の余り」を使って算出します。
ここでは異なる色を適用しています。背景色(アルファチャンネル128)に透明度(アルファチャンネル255)を持つ色を適用しています。COLOR_FORMAT_ARGB_RAWモードとCOLOR_FORMAT_ARGB_NORMALIZEモードの最終的なピクセルカラーを計算するためにどの公式が使用されているかという質問があります。
Calculating resulting colorの 記事を参照すると、計算が合いません。
色定数が間違ったデータを保存しているのか、PrintFormat機能が 誤動作しているのか、どこが悪いのでしょうか?
以下は、PrintFormatで色を整数値で出力するスクリプトです。
出力結果です。
なぜclrRedは0x0000FF0000ではなく、0x000000FFと表現さ れるのですか?赤はC'255,0,0'だからです。
clrBlueは なぜ0x0000FFではなく0x00FF0000と 表現されるのですか?青はC'0,0,255'だからです。
これは正しい。ただ、ARGBはColorと比べるとデータの保存形式が違うんです。
記録形式は同じで、最初にアルファチャンネル(ある場合)、次にRGBの順で記録します。ヘルプによると、タイプ リテラルを介してカラー レコードの青。
C'0x00,0x00,0xFF'// 青色
すなわち,整数表現では,青色(アルファチャンネルなし)は,0x0000FFと表記される。しかし、テストスクリプトでは、青色を逆に出力しています。
色彩定数で色が逆に書かれていることが判明した。
色彩定数では、色は逆に書くことが判明しています。
COLOR_FORMAT_ARGB_RAWの 場合、TransparentLevelSet メソッドの パラメータを0(完全透明)にすると、ほぼ透明な状態になりますが、明らかに完全透明ではありません。
COLOR_FORMAT_ARGB_RAWの 場合、TransparentLevelSet メソッドの パラメータを0(完全透明)にすると、ほぼ透明にはなりますが、明らかに完全透明にはなりません。
明確化:透明度 "0 "での残留透明度は、x32でのみ観察されます。x64では透明度が残らない。
COLOR_FORMAT_ARGB_RAW モードでのこの kanvas の動作は、バグなのか x32 と x64 システムでの描画の特徴なのでしょうか?
明確化:透明度 "0 "での残留透明度は、x32でのみ観察されます。x64では透明度が残らない。
COLOR_FORMAT_ARGB_RAW モードでのこの kanvas の動作は、バグなのか x32 と x64 システムでの描画の特徴なのでしょうか?