一个色谱的实现

问题由来

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

原理

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

颜色 r g b
255 0 0
过渡 255 + 0
255 255 0
过渡 255 0
绿 0 255 0
过渡 0 255 +
0 255 255
过渡 0 255
0 0 255

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

代码实现

.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));
            }
        }
    }
}

结果

如图
一个色谱的实现_第1张图片

你可能感兴趣的:(色谱,颜色过渡)