一个高级渐变渲染类
一篇关于渲染不同渐变的的文章。
引言
本文是关于渐变的(简单的和不那么简单的)。开发了一个简单的类,以帮助渲染不同的渐变类型,例如:水平、垂直、对角、径向、双色和多色,作为一个特殊情况,自定义渐变(基于用户创建的区域)。此外,该类具有内置的伽马校正方法,具有可调节的伽马阈值。
背景
关于渐变,有许多可用的资源(在CodeProject和互联网上),所以这篇文章只是解决这个问题的一种方式。
使用代码
使用这个类非常简单。您应该包含类头文件Gradient.h,之后,您将能够创建多个CGradient
类的实例。但它们都做同样的事情,如下所述
#include "Gradient.h" /* Somewhere in OnDraw method */ CGradient gradient; RECT rect = {100, 100, 200, 200}; COLORREF colorStart = RGB(255,0,0); COLORREF colorEnd = RGB(0,0,255); gradient.HorizontalGradient(pDC->m_hDC, rect, colorStart, colorEnd);
这足以获得一个水平双色渐变。在基本情况下,CGradient
类的所有方法都以相同的方式工作。这些方法的最后两个参数是BOOL
和double
,它们分别打开/关闭伽马校正并设置伽马校正值。有关详细信息,请参阅“Gradient.h”头文件。
可以绘制以下渐变
- 双色水平渐变
- 双色垂直渐变
- 双色正对角线渐变
- 双色反对角线渐变
- 双色径向渐变
- 多色水平渐变
- 多色垂直渐变
- 多色径向渐变
- 自定义双色水平渐变
- 自定义双色垂直渐变
- 自定义多色水平渐变
- 自定义多色垂直渐变
自定义渐变怎么样?
好吧,与其将RECT
变量作为双色或多色水平和垂直渐变的参数传递,我们可以传递HRGN
变量。对于这个有重载的方法(上面列表中的最后四个)。这样,可以用很少的努力创建自定义区域来实现美丽的效果。我应该在这里提到,如果使用HRGN
,渐变的渲染速度将慢于使用RECT
。这主要是因为在这种情况下必须调用Win API方法PtInRegion()
来检查一个像素是否属于该区域。
伽马校正怎么样?
伽马校正用于获得平滑的渐变比例。众所周知,不同的显示器对不同的像素强度值应用不同的光强度(基于输入电压)。这意味着如果一个像素的强度为255,它应该是白色的,具有最大的光强度。而强度为128(灰色)的像素应该只有前一个像素一半的光强度。对吧?不,根本不是。也许是73%或别的什么,我不知道。但如果您应用简单的颜色处理功能,您就可以获得非常好的结果,并且算法的速度不会降低。这是一个非常简单的公式
color = ((color/maximumColor) ^ gamma) * maximumColor;
这适用于所有三个通道(红色、绿色和蓝色),您可以看到结果。伽马值的范围从0到2.5或更多(如果需要),这取决于显示器的类型。在这个项目中,使用伽马值0.4。如果发现这个值不适合您的情况,您可以使用其他值。较小的值会使图像更亮,而较大的值会使图像更暗。
结论
有一些方法可以用来使自定义渐变渲染得更好,我仍在研究中。
关注点
我被GDI+画笔(特别是LinearGradientBrush
)所打动,它可以创建出色的渐变,并且还可以调整伽马值。