一个色谱的实现

30 篇文章 4 订阅

问题由来

研究等值线填充的时候,碰到一个问题:在填充的时候需要计算某一等值线值对应的颜色,而RGB颜色是由三个变量决定的值,由红变蓝过程中是哪几个变量在变化,搞不清楚。花了点时间,在ps里拖了几次它的色谱图,才发现规律,其实很简单.

原理

基本颜色(红->(黄)->绿->(青)->蓝)变化其实每次只有1个变量在变化。示意图如下。

颜色rgb
25500
过渡255+0
2552550
过渡2550
绿02550
过渡0255+
0255255
过渡0255
00255

其中+表示颜色递增,-表示颜色份量递减

代码实现

.h
class CColorBar
{
public:
    CColorBar();
    ~CColorBar();
    void SetRange(CRect rc);
    void DrawColorBar(CDC* pDC);
protected:
private:
    BYTE r;
    BYTE g;
    BYTE b;
    CRect rc;

};
.cpp
CColorBar::CColorBar()
{
    r = 0;
    g = 0;
    b = 0;
}
CColorBar::~CColorBar()
{

}
void CColorBar::SetRange(CRect rect)
{
    rc = rect;
}

void CColorBar::DrawColorBar(CDC* pDC)
{
    ASSERT(pDC);
    int deltaC;
    for (int x=rc.left;x<rc.right;x++)
    {
        for (int y=rc.top;y<rc.bottom;y++)
        {
            deltaC = (y-rc.top) * 255 * 4 / rc.Height();

            if (deltaC>=0 && deltaC<=255)
            {
                r = 255;
                g = 0;
                b = 0;
                pDC->SetPixel(x,y,RGB(r,g+deltaC,b));
            }
            if (deltaC>255 && deltaC<=255*2)
            {
                r = 255;
                g = 255;
                b = 0;
                pDC->SetPixel(x,y,RGB(r-deltaC+255,g,b));
            }
            if (deltaC>255*2 && deltaC<=255*3)
            {
                r = 0;
                g = 255;
                b = 0;
                pDC->SetPixel(x,y,RGB(r,g,b+deltaC-255*2));
            }
            if (deltaC>255*3 && deltaC<=255*4)
            {
                r = 0;
                g = 255;
                b = 255;
                pDC->SetPixel(x,y,RGB(r,g-deltaC+255*3,b));
            }
        }
    }
}

结果

如图
结果图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值