VS2015图标指南 - 颜色反转

时间:2016-04-21 19:39:36

标签: c# visual-studio visual-studio-2015

我下载了一组VS2015图标并通过MSDN guide

阅读

在“使用图像中的颜色”下,声明“为了使图标在Visual Studio黑暗主题中以正确的对比度显示,将以编程方式应用反转。

我正试图在我的应用程序中模仿这种行为,但是当我对图像应用颜色反转时,它并没有像VS黑暗主题那样出现:

enter image description here

有谁知道VS如何反转颜色以便我可以模仿这个?

编辑: 这是我正在使用的反转代码 - 问题似乎是透明度/ alpha的边缘:

        public static void InvertColors(Bitmap bitmapImage)
    {
        var bitmapRead = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
        var bitmapLength = bitmapRead.Stride * bitmapRead.Height;
        var bitmapBGRA = new byte[bitmapLength];
        Marshal.Copy(bitmapRead.Scan0, bitmapBGRA, 0, bitmapLength);
        bitmapImage.UnlockBits(bitmapRead);

        for (int i = 0; i < bitmapLength; i += 4)
        {
            bitmapBGRA[i] = (byte)(255 - bitmapBGRA[i]);
            bitmapBGRA[i + 1] = (byte)(255 - bitmapBGRA[i + 1]);
            bitmapBGRA[i + 2] = (byte)(255 - bitmapBGRA[i + 2]);
        }

        var bitmapWrite = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb);
        Marshal.Copy(bitmapBGRA, 0, bitmapWrite.Scan0, bitmapLength);
        bitmapImage.UnlockBits(bitmapWrite);
    }

2 个答案:

答案 0 :(得分:3)

您可以使用IVsUIShell5.ThemeDIBits方法应用就地反转。还有ThemedImageSourceConverter WPF辅助类来创建反转图像。

答案 1 :(得分:3)

通过方法IVsUIShell5.meDIBits的文档中所述的颜色调整颜色。

  

转换图像的亮度,使恒定的“光晕”光度与背景融为一体。这具有视觉上消除晕圈的效果。 “晕”光度是一个不可变的常数,不是根据输入图像计算的。

因此,您必须将像素转换为HSL颜色空间,调整颜色并将其转换回来。我偶然发现了这个问题:

    private double TransformLuminosity(double luminosity)
    {
        double haloLuminosity = HaloLuminosity; //Color.FromArgb(255, 246, 246, 246)
        double themeBackgroundLuminosity = ThemeBackgroundColor.L;

        if (themeBackgroundLuminosity < LuminosityInversionThreshold) //LuminosityInversionThreshold = 0.5
        {
            haloLuminosity = 1.0 - haloLuminosity;
            luminosity = 1.0 - luminosity;
        }

        if (luminosity < haloLuminosity)
        {
            return themeBackgroundLuminosity * luminosity / haloLuminosity;
        }

        return (1.0 - themeBackgroundLuminosity) * (luminosity - 1.0) / (1.0 - haloLuminosity) + 1.0;
    }

我根据大多数图标Color.FromArgb(255, 246, 246, 246)周围的灰色来确定光晕度。它没有给出完全相同的结果,但它足够令人满意,并且目前符合我的目的。一些例子:

Without transformation

With transformation