Search code examples
.netwinformssystem.drawing

How to determine the disabled color for a given color in winforms?


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)?


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;
    }