使用GDI +和C#更改图像对比度

时间:2011-07-21 08:39:44

标签: c# .net gdi+ screen contrast

我的问题如下:

我正在制作一个程序,它可以通过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);
}

1 个答案:

答案 0 :(得分:1)

尝试查看this article。它是一个颜色矩阵,显示如何操纵亮度和对比度。

This article也可能对您感兴趣,但我认为本文中使用的方法比矩阵慢。