|
|
37.1 I need to save a color as a string and be able to retrieve it. How can I do this?
|
 |
Here are a couple of routines that might do what you want. ColorToString
takes a color and represents it as a string that then can be passed into its
companion StringToColor routine that will take the string back into a color.
I think it works with all types of colors. You can download a test project.
|
public string ColorToString(Color c)
|
s = s.Split(new char[]{'[',']'})[1];
|
string[] strings = s.Split(new char[]{'=',','});
|
if(strings.GetLength(0) > 7)
|
s = strings[1] + "," + strings[3] + "," + strings[5] + "," + strings[7];
|
public Color StringToColor(string s)
|
return (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString(s);
|
37.2 How do I convert a color to integer and vice-versa?
|
 |
You can do it using the FromArgb and ToArgb methods as follows:
|
int blueInt = Color.Blue.ToArgb( );
|
Color newColor = Color.FromArgb( blueInt );
|
37.3 How do I desaturate a specific color?
|
 |
You can provide Intellisense support to your type and it's members by providing xml comments in code as follows:
|
/// Summary description for Form3.
|
public class Form3 : System.Windows.Forms.Form
|
/// Clean up any resources being used.
|
protected override void Dispose( bool disposing )
|
/// Summary of my property
|
Search for the "Tags for Documentation Comments" topic in MSDN for all the available documentation tags.
Then in your project, go to the Project Properties dialog, to the Configuration Properties/Build tab and specify a file for the XML Documentation File property. This will generate a file by that name when you compile your assembly. Place this xml file beside your dll. This will provide Intellisense support for your types in that assembly.
To provide Description support for your properties in the property grid in the designer, add the DescriptionAttribute attribute to your properties in code.
|
37.4 What is alpha blending?
|
 |
Alpha-blending refers to allowing a background color to show through a particular color. You use the static Color.FromArgb method to create a alpha-blended color. For example,
|
SolidBrush redBrushSolid = new SolidBrush(Color.FromArgb(255, 255, 0, 0));
|
SolidBrush redBrushMedium = new SolidBrush(Color.FromArgb(120, 255, 0, 0));
|
SolidBrush redBrushLight = new SolidBrush(Color.FromArgb(60, 255, 0, 0));
|
creates three red brushes. The first argument is the alpha-blending value, from 0 to 255. The last three arguments are the RGB values, denoting in this case, red. In the picture below, all three circles use the color red, but each circle has a different alpha blending setting, allowing the white background to show through.
|
37.5 Is there a way to find out the brightness of a Color?
|
 |
There is a very convenient Color.GetBrightness method that will tell you how close a Color is to black or white. This is useful when you want to use a bright or a dark color to draw based on whether the background Color is dark or bright. |
37.6 How can a translate an OLE_COLOR into a GDI+ Color object?
|
 |
Use the ColorTranslator class. It has methods to translate to / from OLE colors, HTML colors, and Win32 colors.
|
37.7 How do you translate a HSB color to RGB?
|
 |
Here is a routine that does this. Note that the conversion is not precise but very close. (Please do post any better algorithm in our forums).
|
// This does not seem to yield accurate results, but very close.
|
public static void ConvertHSBToRGB(float h, float s, float v, out float r, out float g, out float b)
|
// if s = 0 then h is undefined
|
int i = (int)Math.Floor((double)hue);
|
float p = v * (1.0f - s);
|
float q = v * (1.0f - (s * f));
|
float t = v * (1.0f - (s * (1 - f)));
|
case 0: r = v; g = t; b = p; break;
|
case 1: r = q; g = v; b = p; break;
|
case 2: r = p; g = v; b = t; break;
|
case 3: r = p; g = q; b = v; break;
|
case 4: r = t; g = p; b = v; break;
|
case 5: r = v; g = p; b = q; break;
|
default: r = 0.0f; g = 0.0f; b = 0.0f; break; /*Trace.Assert(false);*/ // hue out of range
|
Public Shared Sub ConvertHSBToRGB(h As Single, s As Single, v As Single, ByRef r As Single, ByRef g As Single, ByRef b As Single)
|
' if s = 0 then h is undefined
|
Dim hue As Single = System.Convert.ToSingle(h)
|
Dim i As Integer = Fix(Math.Floor(System.Convert.ToDouble(hue)))
|
Dim f As Single = hue - i
|
Dim p As Single = v *(1F - s)
|
Dim q As Single = v *(1F - s * f)
|
Dim t As Single = v *(1F - s *(1 - f))
|
b = 0F 'Trace.Assert(false);
|
37.8 Is there a way to force some contrast between two colors (like background color and foreground color)?
|
 |
Here is a routine that will let you do this. The code below uses the routine from our previous faq (how to translate a HSB color to RGB color).
|
/// Adjusts the specified Fore Color's brightness based on the specified back color and preferred contrast.
|
/// The fore Color to adjust.
|
/// The back Color for reference.
|
/// Preferred contrast level.
|
/// This method checks if the current contrast in brightness between the 2 colors is
|
/// less than the specified contrast level. If so, it brigtens or darkens the fore color appropriately.
|
public static void AdjustForeColorBrightnessForBackColor(ref Color foreColor, Color backColor, float prefContrastLevel)
|
float fBrightness = foreColor.GetBrightness();
|
float bBrightness = backColor.GetBrightness();
|
float curContrast = fBrightness - bBrightness;
|
float delta = prefContrastLevel - (float)Math.Abs(curContrast);
|
if((float)Math.Abs(curContrast) < prefContrastLevel)
|
fBrightness = bBrightness + prefContrastLevel;
|
fBrightness = bBrightness - prefContrastLevel;
|
ConvertHSBToRGB(foreColor.GetHue(), foreColor.GetSaturation(), fBrightness, out newr, out newg, out newb);
|
foreColor = Color.FromArgb(foreColor.A, (int)Math.Floor(newr * 255f),
|
(int)Math.Floor(newg * 255f),
|
(int)Math.Floor(newb * 255f));
|
'/ Adjusts the specified Fore Color's brightness based on the specified back color and preferred contrast.
|
'/ The fore Color to adjust.
|
'/ The back Color for reference.
|
'/ Preferred contrast level.
|
'/ This method checks if the current contrast in brightness between the 2 colors is
|
'/ less than the specified contrast level. If so, it brigtens or darkens the fore color appropriately.
|
Public Shared Sub AdjustForeColorBrightnessForBackColor(ByRef foreColor As Color, backColor As Color, prefContrastLevel As Single)
|
Dim fBrightness As Single = foreColor.GetBrightness()
|
Dim bBrightness As Single = backColor.GetBrightness()
|
Dim curContrast As Single = fBrightness - bBrightness
|
Dim delta As Single = prefContrastLevel - System.Convert.ToSingle(Math.Abs(curContrast))
|
If System.Convert.ToSingle(Math.Abs(curContrast)) < prefContrastLevel Then
|
If bBrightness < 0.5F Then
|
fBrightness = bBrightness + prefContrastLevel
|
fBrightness = bBrightness - prefContrastLevel
|
Dim newr, newg, newb As Single
|
ConvertHSBToRGB(foreColor.GetHue(), foreColor.GetSaturation(), fBrightness, newr, newg, newb)
|
foreColor = Color.FromArgb(foreColor.A, Fix(Math.Floor((newr * 255F))), Fix(Math.Floor((newg * 255F))), Fix(Math.Floor((newb * 255F))))
|
End Sub 'AdjustForeColorBrightnessForBackColor
|
|
|
|
|