问题由来
研究等值线填充的时候,碰到一个问题:在填充的时候需要计算某一等值线值对应的颜色,而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));
}
}
}
}
结果
如图