Question

Windows forms has the handy ControlPaint.DrawImageDisabled to paint a color image in a grayed-out, disabled state. Is there a way to determine, for a given color, what the disabled color would be (as if it were drawn by DrawImageDisabled)?

Was it helpful?

Solution

Reflector tells us that this is the code that creates the ColorMatrix that gets used:

// In class-level declarations in ColorPaint
private static ImageAttributes disabledImageAttr;

// In the actual implementation method for DrawImageDisabled
    if (disabledImageAttr == null)
    {
        float[][] newColorMatrix = new float[5][];
        newColorMatrix[0] = new float[] { 0.2125f, 0.2125f, 0.2125f, 0f, 0f };
        newColorMatrix[1] = new float[] { 0.2577f, 0.2577f, 0.2577f, 0f, 0f };
        newColorMatrix[2] = new float[] { 0.0361f, 0.0361f, 0.0361f, 0f, 0f };
        float[] numArray2 = new float[5];
        numArray2[3] = 1f;
        newColorMatrix[3] = numArray2;
        newColorMatrix[4] = new float[] { 0.38f, 0.38f, 0.38f, 0f, 1f };
        ColorMatrix matrix = new ColorMatrix(newColorMatrix);
        disabledImageAttr = new ImageAttributes();
        disabledImageAttr.ClearColorKey();
        disabledImageAttr.SetColorMatrix(matrix);
    }

// To draw the image itself
using (Bitmap bitmap = new Bitmap(image.Width, image.Height))
{
    using (Graphics graphics2 = Graphics.FromImage(bitmap))
    {
        graphics2.DrawImage(image, new Rectangle(0, 0, size.Width, size.Height), 0, 0, size.Width, size.Height, GraphicsUnit.Pixel, disabledImageAttr);
    }
    graphics.DrawImageUnscaled(bitmap, imageBounds);
    return;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top