我下载了一组VS2015图标并通过MSDN guide
阅读在“使用图像中的颜色”下,声明“为了使图标在Visual Studio黑暗主题中以正确的对比度显示,将以编程方式应用反转。”
我正试图在我的应用程序中模仿这种行为,但是当我对图像应用颜色反转时,它并没有像VS黑暗主题那样出现:
有谁知道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);
}
答案 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)
周围的灰色来确定光晕度。它没有给出完全相同的结果,但它足够令人满意,并且目前符合我的目的。一些例子: