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); }
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()); }
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; } }
/// <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); }
/// <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色サイクル } }
/// <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 } }
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); }
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(); } } }
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)); }
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); }
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)))); }
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); }