首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GDI+和C#更改图像对比度

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

Stack Overflow用户
提问于 2011-07-21 16:39:44
回答 1查看 1.4K关注 0票数 3

我的问题如下:

我正在做一个程序,它可以操纵亮度,伽马和对比度通过C#代码。对于亮度和gamma来说,这是可以的。我已经通过我在网络上找到的代码实现了这一点,但我无法进行对比。

到目前为止,我唯一找到的是一个以(double level, double brightness, double gamma, double contrast)作为输入参数的CalculateRamp方法。我知道亮度、gamma和对比度(界面中滑块上的值)的输入是什么,但我不知道级别是什么。

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

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

下面是CalculateRamp方法的代码,因为我调用了函数SetDeviceGammaRamp(...)来处理与当前计算的渐变的对比度。我不确定我是否必须这样使用它:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-03-29 02:41:01

试着看看this article吧。它是一个颜色矩阵,显示了如何同时控制亮度和对比度。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6773344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档