示例#1
0
        public static Color Brightness(this Color color, Color fore)
        {
            var foreMax = Math.Max(fore.R, Math.Max(fore.G, fore.B));
            var tgtHsv  = new HSV(color);

            int newValue      = tgtHsv.Value + foreMax;
            int newSaturation = tgtHsv.Saturation;

            if (newValue > 255)
            {
                var newSaturation2 = newSaturation - (newValue - 255);
                newValue = 255;

                var sChRtLm = (color.R >= color.G && color.R >= color.B) ? 0.95f * 0.7f :
                              (color.G >= color.R && color.G >= color.B) ? 0.95f :
                              0.95f * 0.5f;

                var sChRt = Math.Max(sChRtLm, newSaturation2 / (float)newSaturation);
                if (Single.IsInfinity(sChRt))
                {
                    sChRt = sChRtLm;
                }

                newSaturation = (int)(newSaturation * sChRt);
            }

            tgtHsv.Value      = (byte)newValue;
            tgtHsv.Saturation = (byte)newSaturation;

            var newColor = tgtHsv.ToColor();

            return(newColor);
        }
示例#2
0
        private void OnValueChanged_SelectedHsv()
        {
            UpdateTextBoxes();

            //Update indicators
            float hIndicatorOffset = (float)HueIndicator.Height * -0.5f;

            colorEditor_SV_Shader.Hue = selectedHsv.hue;
            HueIndicator.Margin       = new Thickness(0f, selectedHsv.hue / 360f * ColorBox_Hue.ActualHeight + hIndicatorOffset, 0f, 0f);

            float svIndicatorOffset = (float)SvIndicator.Width * -0.5f;

            SvIndicator.Margin = new Thickness(selectedHsv.saturation * ColorBox_SV.ActualWidth + svIndicatorOffset, (1f - selectedHsv.value) * ColorBox_SV.ActualHeight + svIndicatorOffset, 0f, 0f);

            NewColorIndicator.Fill = selectedHsv.ToColor().ToBrush();

            ValueChanged?.Invoke(selectedHsv.ToColor().ToUColor());
        }
示例#3
0
        private void InitFirePalette(float hue)
        {
            _firePalette = new Color[200];
            var hsv = new HSV {
                Hue = hue, Saturation = 1.0f
            };

            for (var i = 0; i < 100; i++)
            {
                hsv.Value       = i / 100.0f;
                _firePalette[i] = hsv.ToColor();
            }

            hsv.Value = 1.0f;
            for (var i = 0; i < 100; i++)
            {
                _firePalette[i + 100] = hsv.ToColor();
                hsv.Hue = (hsv.Hue + 0.00166666f) % 1f;
            }
        }
示例#4
0
        /// <summary>
        /// Derive all colors from the given base color
        /// </summary>
        /// <param name="dictionary">Dictionary to store new Colors</param>
        /// <param name="baseColor"></param>
        public static void CalculateColors(ref ResourceDictionary dictionary, Color baseColor)
        {
            HSV bc = HSV.FromColor(baseColor);

            HSV baseborder = HSV.FromColor(Color.FromRgb(102, 102, 102));

            baseborder.H = bc.H;
            baseborder.S = bc.S * 0.5;
            Color selectedcolorhover = HSV.FromHSV(bc.H, bc.S, bc.V * 0.7);

            selectedcolorhover.A = 80;

            Color transm3 = baseborder.ToColor(0, 0, 0.1);

            transm3.A = 119;
            Color transm2t = baseborder.ToColor(0, 0, -0.2);

            transm2t.A = 34;

            dictionary["BaseColor"]                = HSV.FromHSV(bc.H, bc.S * 0.7, bc.V * 0.4);
            dictionary["SelectedColor"]            = bc.ToColor();
            dictionary["DarkerSelectedColor"]      = HSV.FromHSV(bc.H, bc.S, bc.V * 0.7);
            dictionary["DarkerSelectedColorHover"] = selectedcolorhover;
            dictionary["BaseM2Color"]              = baseborder.ToColor(0, 0, -0.2);
            dictionary["BaseM2TColor"]             = transm2t;
            dictionary["BaseM1Color"]              = baseborder.ToColor(0, 0, -0.15);
            dictionary["Base1Color"]               = baseborder.ToColor(0, 0, 0.025);
            dictionary["Base2Color"]               = baseborder.ToColor(0, 0, 0.05);
            dictionary["Base3Color"]               = baseborder.ToColor(0, 0, 0.1);
            dictionary["Base3TColor"]              = transm3;
            dictionary["Base4Color"]               = baseborder.ToColor(0, 0, 0.125);
            dictionary["Base5Color"]               = baseborder.ToColor(0, 0, 0.15);
            dictionary["Base6Color"]               = baseborder.ToColor(0, 0, 0.175);
            dictionary["TextColor"]                = Colors.White;
            dictionary["ErrorColor"]               = Color.FromRgb(255, 136, 136);
            dictionary["DarkErrorColor"]           = Color.FromRgb(170, 68, 68);
        }
示例#5
0
        /// <summary>
        /// 指定レンジいっぱいに使って、色で数値を分けることができるようにする。
        /// </summary>
        /// <param name="no"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        public static Color GetColorByNumber(int no, int range)
        {
            if (no < 0)
            {
                no = -no;
            }

            if (range <= 10)
            {
                switch (no % 10)
                {
                case 0: return(Color.FromArgb(8, 8, 8));    // 黒い礼(0)服

                case 1: return(Color.Brown);                // 茶を一杯

                case 2: return(Color.Red);                  // 赤いに(2)んじん

                case 3: return(Color.Orange);               // 第(橙)三者

                case 4: return(Color.Yellow);               // 岸(黄4)恵子

                case 5: return(Color.Green);                // 緑子(5)

                case 6: return(Color.Blue);                 // ろく(6)でなしの青二才

                case 7: return(Color.Purple);               // 紫式(7)部

                case 8: return(Color.Gray);                 // ハイ(灰)ヤー(8)

                case 9: return(Color.White);                // ホワイトク(9)リスマス

                default:
                    break;
                }
                return(Color.DarkGray);
            }
            else
            {
                var h   = (no * 129) % 360; // 120サイクル
                var s   = (no / 120) % 20;  // 20ステップ
                var v   = (no / 2400) % 20; // 20ステップ
                var hsv = new HSV(h, 1f - (float)s / 20, 1f - (float)v / 20);
                return(hsv.ToColor());      // 48000色サイクル
            }
        }
示例#6
0
        /// <summary>
        /// make color from value between range
        /// </summary>
        /// <param name="value"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        public static Color GetColorByNumber(int value, int range)
        {
            if (value < 0)
            {
                value = -value;
            }

            if (range <= 10)
            {
                switch (value % 10)
                {
                case 0: return(Color.FromArgb(255, 8, 8, 8));    // 黒い礼(0)服

                case 1: return(Colors.Brown);                    // 茶を一杯

                case 2: return(Colors.Red);                      // 赤いに(2)んじん

                case 3: return(Colors.Orange);                   // 第(橙)三者

                case 4: return(Colors.Yellow);                   // 岸(黄4)恵子

                case 5: return(Colors.Green);                    // 緑子(5)

                case 6: return(Colors.Blue);                     // ろく(6)でなしの青二才

                case 7: return(Colors.Purple);                   // 紫式(7)部

                case 8: return(Colors.Gray);                     // ハイ(灰)ヤー(8)

                case 9: return(Colors.White);                    // ホワイトク(9)リスマス
                }
                return(Colors.DarkGray);
            }
            else
            {
                var h   = (value * 129) % 360; // 120 cycle
                var s   = (value / 120) % 20;  // 20 step
                var v   = (value / 2400) % 20; // 20 step
                var hsv = new HSV(h, 1f - (float)s / 20, 1f - (float)v / 20);
                return(hsv.ToColor());         // 48000 color cycle
            }
        }
示例#7
0
        public Color[,] RenderEffect(Color[,] buffer, Color[] palette, int eventToRender)
        {
            const int speedFactor  = 200;
            var       bufferHeight = buffer.GetLength(Utils.IndexRowsOrHeight);
            var       bufferWidth  = buffer.GetLength(Utils.IndexColsOrWidth);

            Color color;
            var   hsv2     = new HSV();
            var   colorcnt = palette.Length;
            var   cycleLen = colorcnt * speedFactor;
            var   count    = tbCount.Value;

            if (eventToRender > (colorcnt - 1) * speedFactor * count && count < 10)
            {
                color = palette.GetMultiColorBlend(count % 2, false);
            }
            else
            {
                color = palette.GetMultiColorBlend(eventToRender % cycleLen / (double)cycleLen, true);
            }
            var hsv        = color.ToHSV();
            var halfHeight = (bufferHeight - 1) / 2.0;
            var halfWidth  = (bufferWidth - 1) / 2.0;

            for (var col = 0; col < bufferWidth; col++)
            {
                for (var row = 0; row < bufferHeight; row++)
                {
                    hsv2.SetToHSV(hsv);
                    if (chkBoxHFade.Checked)
                    {
                        hsv2.Value *= (float)(1.0 - Math.Abs(halfWidth - col) / halfWidth);
                    }
                    if (chkBoxVFade.Checked)
                    {
                        hsv2.Value *= (float)(1.0 - Math.Abs(halfHeight - row) / halfHeight);
                    }
                    buffer[row, col] = hsv2.ToColor();
                }
            }
            return(buffer);
        }
示例#8
0
        private void UpdateComponents()
        {
            // notch transform angle runs from 15 to 345
            // circle seg arc length runs from 0 to 330

            double r = (Value - Minimum) / (Maximum - Minimum);

            if (transform != null)
            {
                transform.Angle = r * arcLength + (360.0 - arcLength) / 2.0;
            }

            if (outline != null)
            {
                outline.ArcLength = r * arcLength;

                if (ColorOutline)
                {
                    HSV hsv = new HSV(r * -0.3 + 0.3, 1, 1);
                    outlineBrush.Color = hsv.ToColor();
                }
            }
        }
示例#9
0
        public Bitmap ApplyGabor(Bitmap sourceImage)
        {
            ImageUtils image  = new ImageUtils();
            var        width  = image.Width;
            var        height = image.Height;
            var        bytes  = image.Bytes;
            var        result = new byte[bytes];

            var mid    = (_size) / 2;
            var values = new double[width, height];

            var kernel0   = CreateGaborFilter(0);
            var kernel45  = CreateGaborFilter(45);
            var kernel135 = CreateGaborFilter(135);
            var kernel90  = CreateGaborFilter(90);

            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    var gaborValue = 0.0;
                    for (var fy = 0; fy < _size; ++fy)
                    {
                        for (var fx = 0; fx < _size; ++fx)
                        {
                            var value = 0.0;
                            if (x + fx - mid >= 0 && x + fx - mid < width && y + fy - mid >= 0 && y + fy - mid < height)
                            {
                                value = HSV.HsvFromColor(sourceImage.GetPixel(x + fx - mid, y + fy - mid)).V;
                            }
                            else
                            {
                                value = HSV.HsvFromColor(sourceImage.GetPixel(x, y)).V;
                            }

                            gaborValue += kernel0[fy, fx] * value;
                            gaborValue += kernel45[fy, fx] * value;
                            gaborValue += kernel90[fy, fx] * value;
                            gaborValue += kernel135[fy, fx] * value;
                        }
                    }
                    values[x, y] = gaborValue;
                }
            }

            var max = values[0, 0];
            var min = values[0, 0];

            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    if (values[x, y] > max)
                    {
                        max = values[x, y];
                    }
                    if (values[x, y] < min)
                    {
                        min = values[x, y];
                    }
                }
            }
            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    if (min < 0)
                    {
                        if (max >= 0)
                        {
                            values[x, y] -= min;
                            values[x, y] /= -min + max;
                            values[x, y] *= 100;
                        }
                        else
                        {
                            values[x, y] -= min;
                            values[x, y] /= -min - max;
                            values[x, y] *= 100;
                        }
                    }
                    else
                    {
                        values[x, y] += min;
                        values[x, y] /= min + max;
                        values[x, y] *= 100;
                    }
                }
            }

            for (var i = 0; i < bytes; i += 4)
            {
                HSV hsv = new HSV {
                    H = 0, S = 0, V = values[(i / 4) % width, (i / 4) / width]
                };
                hsv.ToColor();
                result[i + 0] = hsv.ToColor().R;
                result[i + 1] = hsv.ToColor().G;
                result[i + 2] = hsv.ToColor().B;
                result[i + 3] = 255;
            }
            return(image.BytesToBitmap(result));
        }
示例#10
0
        public Color[,] RenderEffect(Color[,] buffer, Color[] palette, int eventToRender)
        {
            var h            = 0.0;
            var bufferHeight = buffer.GetLength(Utils.IndexRowsOrHeight);
            var bufferWidth  = buffer.GetLength(Utils.IndexColsOrWidth);
            var hsv          = new HSV();
            var maxframe     = bufferHeight * 2;
            var frame        = (int)((bufferHeight * (double)eventToRender / 200.0) % maxframe);
            var offset       = eventToRender / 100.0;

            for (var col = 0; col < bufferWidth; col++)
            {
                for (var row = 0; row < bufferHeight; row++)
                {
                    double x1;
                    double y1;
                    double f;
                    switch (tbStyle.Value)
                    {
                    case 1:
                        var n =
                            Math.Abs((col * col - row * row) *
                                     Math.Sin(offset + ((col + row) * Pi2 / (bufferHeight + bufferWidth))));
                        var d = col * col + row * row + 1;
                        h = n / d;
                        break;

                    case 2:
                        f  = (frame < maxframe / 2) ? frame + 1 : maxframe - frame;
                        x1 = (col - bufferWidth / 2.0) / f;
                        y1 = (row - bufferHeight / 2.0) / f;
                        h  = Math.Sqrt(x1 * x1 + y1 * y1);
                        break;

                    case 3:
                        f  = (frame < maxframe / 2) ? frame + 1 : maxframe - frame;
                        f  = f * 0.1 + bufferHeight / 60.0;
                        x1 = (col - bufferWidth / 2.0) / f;
                        y1 = (row - bufferHeight / 2.0) / f;
                        h  = Math.Sin(x1) * Math.Cos(y1);
                        break;
                    }
                    hsv.Saturation = 1.0f;
                    hsv.Value      = 1.0f;
                    var chunks = tbChunks.Value;
                    var skip   = tbSkip.Value;
                    if (chunks > 1 && ((int)(h * chunks)) % skip == 0)
                    {
                        continue;
                    }
                    Color color;
                    if (cbColors.SelectedIndex == 0)
                    {
                        hsv.Hue = (float)h;
                        color   = hsv.ToColor();
                    }
                    else
                    {
                        color = palette.GetMultiColorBlend(h, false);
                    }

                    buffer[row, col] = color;
                }
            }
            return(buffer);
        }
示例#11
0
    public static void Test()
    {
        HSV color;

        color = new HSV(Color.red);
        Debug.Log("red: " + color);
        Debug.Log("red: " + color.ToColor());

        color = new HSV(Color.green);
        Debug.Log("green: " + color);
        Debug.Log("green: " + color.ToColor());

        color = new HSV(Color.blue);
        Debug.Log("blue: " + color);
        Debug.Log("blue: " + color.ToColor());

        color = new HSV(Color.grey);
        Debug.Log("grey: " + color);
        Debug.Log("grey: " + color.ToColor());

        color = new HSV(Color.white);
        Debug.Log("white: " + color);
        Debug.Log("white: " + color.ToColor());

        color = new HSV(new Color(0.4f, 1f, 0.84f, 1f));
        Debug.Log("0.4, 1f, 0.84: " + color);
        Debug.Log("0.4, 1f, 0.84: " + color.ToColor());

        Debug.Log("164,82,84   .... 0.643137f, 0.321568f, 0.329411f  :" + ToColor(new HSV(new Color(0.643137f, 0.321568f, 0.329411f))));
    }
示例#12
0
        public Color[,] RenderEffect(Color[,] buffer, Color[] palette, int eventToRender)
        {
            if (eventToRender == 0)
            {
                _meteors.Clear();
            }

            var bufferHeight = buffer.GetLength(Utils.IndexRowsOrHeight);
            var bufferWidth  = buffer.GetLength(Utils.IndexColsOrWidth);
            var mspeed       = eventToRender - _lastRenderedEvent;

            _lastRenderedEvent = eventToRender;

            // create new meteors
            var hsv        = new HSV();
            var hsv0       = palette[0].ToHSV();
            var hsv1       = (palette.Length > 1 ? palette[1] : palette[0]).ToHSV();
            var colorcnt   = palette.Length;
            var count      = bufferWidth * tbCount.Value / 100;
            var tailLength = (bufferHeight < 10) ? tbTrailLength.Value / 10 : bufferHeight * tbTrailLength.Value / 100;

            if (tailLength < 1)
            {
                tailLength = 1;
            }
            var tailStart = bufferHeight - tailLength;

            if (tailStart < 1)
            {
                tailStart = 1;
            }
            for (var i = 0; i < count; i++)
            {
                var m = new MeteorClass {
                    X = _random.Next() % bufferWidth, Y = bufferHeight - 1 - (_random.Next() % tailStart)
                };
                switch (cbType.SelectedIndex)
                {
                case 1:
                    m.HSV = hsv0.CreateRangeTo(hsv1);
                    break;

                case 2:
                    m.HSV = palette[_random.Next() % colorcnt].ToHSV();
                    break;
                }
                _meteors.Add(m);
            }

            // render meteors
            foreach (var meteor in _meteors)
            {
                {
                    for (var ph = 0; ph < tailLength; ph++)
                    {
                        switch (cbType.SelectedIndex)
                        {
                        case 0:
                            hsv.Hue        = _random.Next() % 1000 / 1000.0f;
                            hsv.Saturation = 1.0f;
                            hsv.Value      = 1.0f;
                            break;

                        default:
                            hsv.SetToHSV(meteor.HSV);
                            break;
                        }
                        hsv.Value *= (float)(1.0 - (double)ph / tailLength);
                        if (meteor.X < 0 || meteor.X >= bufferWidth || meteor.Y + ph < 0 || meteor.Y + ph >= bufferHeight)
                        {
                            continue;
                        }
                        var y = meteor.Y + (chkBoxUp.Checked ? -ph : ph);
                        if (y >= 0 && y < bufferHeight)
                        {
                            buffer[y, meteor.X] = hsv.ToColor();
                        }
                    }
                    meteor.Y += (chkBoxUp.Checked ? mspeed : -mspeed);
                }
            }
            // delete old meteors
            var meteorNum = 0;

            while (meteorNum < _meteors.Count)
            {
                if (_meteors[meteorNum].HasExpired(tailLength))
                {
                    _meteors.RemoveAt(meteorNum);
                }
                else
                {
                    meteorNum++;
                }
            }
            return(buffer);
        }