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

标签 c# .net gdi+ screen contrast

我的问题如下:

我正在制作一个程序,它可以通过 C# 代码控制亮度、 Gamma 和对比度。对于亮度和 Gamma ,它是可以的。我已经通过我在网上找到的代码实现了它,但我不能对比。

我现在唯一找到的是 CalculateRamp 方法,它的输入参数是 (双电平、双亮度、双 Gamma 、双对比度)。我知道要为亮度、 Gamma 和对比度(界面中 slider 的值)提供什么输入,但我不知道级别是什么。

此方法的另一个问题是,当我将带有随机 level 参数的计算斜坡作为参数传递给 SetDeviceGammaRamp(IntPtr hDC,ref RAMP rmp) 时,它实际上更改屏幕对比度,但是当我移动亮度 slider 时,对比度 slider 所做的更改会丢失。可能是因为使用了相同的方法,或者我不确定是什么原因。

我将非常感谢任何帮助或想法,无论它们是对我当前不完整的解决方案的更改,还是全新的解决方案 - 我更喜欢 - 因为我在某种程度上对此不确定。在此先感谢大家。

这是 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);
}

最佳答案

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

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

关于c# - 使用 GDI+ 和 C# 更改图像对比度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6773344/

相关文章:

c# - 捕获通过调试器调用的进程的输出

c# - 从 IDE 调试项目但在 IDE 外部运行时未捕获异常

c# - 将一个 int 添加到它的现有数组中

c# - 在给定矩形的情况下在 GDI+ 中绘制三角形

gdi+ - MeasureString()填充左侧和右侧的文本

delphi - GDI+ DrawLine 什么都不画

c# - SqlException '?' 附近的语法不正确

c# - 在windwos8中创建文件夹访问被拒绝

c# - 即使对于最简单的示例,EF Core 3.1/EF Core 5.0中的GroupBy也无法正常工作

c# - 将字符串拆分为字典