【发布时间】:2011-10-10 01:01:02
【问题描述】:
我的问题如下:
我正在制作一个程序,它可以通过 C# 代码来控制亮度、伽玛和对比度。对于亮度和伽玛,它是可以的。我已经通过我在网上找到的代码实现了它,但我无法对比。
我现在唯一找到的是CalculateRamp 方法,它的输入参数为(double level, double brightness, double gamma, double contrast)。我知道要为亮度、伽玛和对比度(界面中滑块的值)提供什么输入,但我不知道什么级别。
此方法的另一个问题是,当我将带有随机level 参数的计算斜坡作为参数传递给SetDeviceGammaRamp(IntPtr hDC,ref RAMP rmp) 时,它实际上会改变屏幕对比度,但是当我移动亮度滑块时,对比度会发生变化滑块丢失。这可能是因为使用了相同的方法或者我不确定是什么。
我将非常感谢任何帮助或想法,无论它们是对我当前不完整的解决方案的更改,还是全新的解决方案 - 我更喜欢 - 因为我在某种程度上对此感到不确定。在此先感谢大家。
这是CalculateRamp 方法的代码,因为我调用了函数SetDeviceGammaRamp(...) 来控制与当前计算的斜率的对比度。我不确定我是否必须以这种方式使用它:
public static void CalculateRamp(double level, double gamma, double brightness, double contrast)
{
ramp.Red = new ushort[256];
ramp.Green = new ushort[256];
ramp.Blue = new ushort[256];
gamma /= 10;
brightness = 1 + (((brightness - 50) / 100) * 65535);
contrast = 1 + ((contrast - 50) / 100);
level = 1 + ((level - 50) / 100);
for (int i = 0; i < 256; i++)
{
double value = i * 256;
value = (Math.Pow(value / 65535, 1 / gamma) * 65535) + 0.5;
value = ((((value / 65535) - 0.5) * contrast) + 0.5) * 65535;
value = value += brightness;
value *= level;
ramp.Red[i] = ramp.Green[i] = ramp.Blue[i] = (ushort)Math.Min((double)65535, Math.Max((double)0, value));
}
SetDeviceGammaRamp(GetDC(IntPtr.Zero), ref ramp);
}
【问题讨论】:
标签: c# .net gdi+ screen contrast