65.9K
CodeProject 正在变化。 阅读更多。
Home

一个高级渐变渲染类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (16投票s)

2006 年 3 月 20 日

CPOL

3分钟阅读

viewsIcon

61844

downloadIcon

1471

一篇关于渲染不同渐变的的文章。

CGradientTest Project

引言

本文是关于渐变的(简单的和不那么简单的)。开发了一个简单的类,以帮助渲染不同的渐变类型,例如:水平、垂直、对角、径向、双色和多色,作为一个特殊情况,自定义渐变(基于用户创建的区域)。此外,该类具有内置的伽马校正方法,具有可调节的伽马阈值。

背景

关于渐变,有许多可用的资源(在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类的所有方法都以相同的方式工作。这些方法的最后两个参数是BOOLdouble,它们分别打开/关闭伽马校正并设置伽马校正值。有关详细信息,请参阅“Gradient.h”头文件。

可以绘制以下渐变

  • 双色水平渐变
  • 双色垂直渐变
  • 双色正对角线渐变
  • 双色反对角线渐变
  • 双色径向渐变
  • 多色水平渐变
  • 多色垂直渐变
  • 多色径向渐变
  • 自定义双色水平渐变
  • 自定义双色垂直渐变
  • 自定义多色水平渐变
  • 自定义多色垂直渐变

自定义渐变怎么样?

好吧,与其将RECT变量作为双色或多色水平和垂直渐变的参数传递,我们可以传递HRGN变量。对于这个有重载的方法(上面列表中的最后四个)。这样,可以用很少的努力创建自定义区域来实现美丽的效果。我应该在这里提到,如果使用HRGN,渐变的渲染速度将于使用RECT。这主要是因为在这种情况下必须调用Win API方法PtInRegion()来检查一个像素是否属于该区域。

伽马校正怎么样?

伽马校正用于获得平滑的渐变比例。众所周知,不同的显示器对不同的像素强度值应用不同的光强度(基于输入电压)。这意味着如果一个像素的强度为255,它应该是白色的,具有最大的光强度。而强度为128(灰色)的像素应该只有前一个像素一半的光强度。对吧?不,根本不是。也许是73%或别的什么,我不知道。但如果您应用简单的颜色处理功能,您就可以获得非常好的结果,并且算法的速度不会降低。这是一个非常简单的公式

color = ((color/maximumColor) ^ gamma) * maximumColor;

这适用于所有三个通道(红色、绿色和蓝色),您可以看到结果。伽马值的范围从0到2.5或更多(如果需要),这取决于显示器的类型。在这个项目中,使用伽马值0.4。如果发现这个值不适合您的情况,您可以使用其他值。较小的值会使图像更亮,而较大的值会使图像更暗。

结论

有一些方法可以用来使自定义渐变渲染得更好,我仍在研究中。

关注点

我被GDI+画笔(特别是LinearGradientBrush)所打动,它可以创建出色的渐变,并且还可以调整伽马值。

© . All rights reserved.