One of the nice things about WPF is that it sets us free from the world of "battle-ship gray" that is Windows Forms and Win32, and lets us enter the promised land of glorious technicolored, gradient-filled User Interfaces with all kinds of fancy typography and bouncy animated buttons.
Of course, with great power comes great responsibility not to offend users' sensibilities with garish colour schemes. For artistically challenged developers there are sites like Kuler that help with composing tasteful colour schemes1. And now there's my offering.
This is something that a colleague (hi Simon!) and I put together when we were developing a WPF chart control back in the days of .Net 3.0 beta 2. We wanted to be able to generate charts with randomly coloured series, avoiding the horrible mishmash of colours with which Excel paints its charts. We came up with a random pastel colour generator.
The principle is quite simple. You just need to observe that, in the RGB colour model pleasing pastel palettes pop out when you pick red, green and blue values fairly close to each other in the middle of the range 0-256. It generates results like this:
and this:
Here's the code (in C#)2:
using System; using System.Windows.Media; /// <summary> /// Provides a range of tasteful random pastel colors /// </summary> public class RandomPastelColorGenerator { private readonly Random _random; public RandomPastelColorGenerator() { // seed the generator with 2 because // this gives a good sequence of colors const int RandomSeed = 2; _random = new Random(RandomSeed); } /// <summary> /// Returns a random pastel brush /// </summary> /// <returns></returns> public SolidColorBrush GetNextBrush() { SolidColorBrush brush = new SolidColorBrush(GetNext()); // freeze the brush for efficiency brush.Freeze(); return brush; } /// <summary> /// Returns a random pastel color /// </summary> /// <returns></returns> public Color GetNext() { // to create lighter colours: // take a random integer between 0 & 128 (rather than between 0 and 255) // and then add 127 to make the colour lighter byte[] colorBytes = new byte[3]; colorBytes[0] = (byte)(_random.Next(128) + 127); colorBytes[1] = (byte)(_random.Next(128) + 127); colorBytes[2] = (byte)(_random.Next(128) + 127); Color color = new Color(); // make the color fully opaque color.A = 255; color.R = colorBytes[0]; color.B = colorBytes[1]; color.G = colorBytes[2]; return color; } }
Footnotes
- Here's a list of other colour-scheme generators.
- If you've not entered the promised land of WPF, it shouldn't be too hard to convert this to Windows Forms lingo. I'll leave that as an exercise to the reader...
9 comments:
Is a Great.
thanks
Amazing!
This is exactly what I was looking for!
Thank you!
Nice article thanks
Very Good!!!
Is there any posible way to translate this to work in ASP .Net?
Thanks! Very good!
Winforms
private Random _random = new Random( 2 );
public Color GetNext()
{
return Color.FromArgb( 255, _random.Next(128) + 127, _random.Next (128) + 127, _random.Next(128) + 127 );
}
After so much time... still useful. Thanks!
Hi niice reading your blog
Post a Comment