匯東網


基于 HSL 色彩模型的渐变色矩形绘制函数

[編輯] [转简体]
|
作者:huidong | 分類:【編程】EasyX
[ 21 瀏覽 0 評論 9 贊 10 踩 ]

概要

正文

原创

// 绘制渐变色矩形
// c 原色
// kh, ks ,kl 色彩的 HSL 单位像素变化率
// 注:H 和 S 的渐变不能实现异色过渡
void GradientRectangle(RECT rct, COLORREF c, float kh, float ks, float kl)
{
    float h, s, l;
    RGBtoHSL(c, &h, &s, &l);
    int nOldLineColor = getlinecolor();
    for (int i = 0; i < rct.right - rct.left; i++)
    {
        setlinecolor(HSLtoRGB(h + i * kh, s + i * ks, l + i * kl));
        line(i + rct.left, rct.top, i + rct.left, rct.bottom);
    }
    setlinecolor(nOldLineColor);
}

// 绘制渐变色矩形
// c1, c2 初始颜色、终止颜色
void GradientRectangle(RECT rct, COLORREF c1, COLORREF c2)
{
    float h[2], s[2], l[2];
    COLORREF c[2] = { c1,c2 };
    for (int i = 0; i < 2; i++)
        RGBtoHSL(c[i], &h[i], &s[i], &l[i]);
    int len = rct.right - rct.left;
    float kh = (h[1] - h[0]) / len;
    float ks = (s[1] - s[0]) / len;
    float kl = (l[1] - l[0]) / len;
    GradientRectangle(rct, c[0], kh, ks, kl);
}

// 绘制渐变色矩形
// c 初始颜色(只用于 H 和 S 的采样)
// l1, l2 初始亮度、终止亮度(暗 0 ~ 1 亮)
void GradientRectangle(RECT rct, COLORREF c, double l1, double l2)
{
    float h, s, l;
    RGBtoHSL(c, &h, &s, &l);
    GradientRectangle(rct, HSLtoRGB(h, s, (float)l1), 0, 0, (float)(l2 - l1) / (rct.right - rct.left));
}

只写了横向的颜色过渡。


[ 9] [ 10]


 評論區  0 條評論

+ 添加評論