请教颜色叠加的方法
使用GDI绘图,背景为黑色,用CPen、LineTo画线。
第一次画了一条红色的线;
第二次画了一条绿色的线;
这两条线段有交叉点。
问:如何使交叉点为“叠加色”?(注:现在交叉点被覆盖成绿色了)
叠加色的计算公式应用别人的方法:
第一步:分解rgb分量,得到,r1,g1,b1和r2,g2,b2
第二步:确定百分比,例如:为y1为0.3,y2为0.7
第三步:计算合成色的rgb分量:r3=r1*0.3+r2*0.7:g3=g1*0.3+g2*0.7:b3=b1*0.3+b2*0.7
第四步:合成颜色,更具rgb值得到颜色值
[解决办法]
不好意思,刚在U盘里发现我原来有这个代码,给你贴上
void Sprite::DrawTransAlpha(HDC hdcBack,int nXBack,int nYBack,int nWidthBack,int nHeightBack,
int nXFore,int nYFore,int nAlpha,COLORREF crTrans)
{
if(m_hbm!=NULL)
{
HDC hdcMem=CreateCompatibleDC(hdcBack);
RECT rBackRect={nXBack,nYBack,nWidthBack,nHeightBack};
HBITMAP hbmTmp=CreateCompatibleBitmap(hdcBack,nWidthBack,nHeightBack);
HBITMAP hbmBK=(HBITMAP)SelectObject(hdcBack,hbmTmp);
RECT rForeRect={nXFore,nYFore,nXFore+m_nWidth,nYFore+m_nHeight};
RECT rTransRect,rTransRect2;
if(IntersectRect(&rTransRect,&rBackRect,&rForeRect))
{
BITMAP bm,bmBK;
GetObject(m_hbm,sizeof(BITMAP),&bm);
BYTE *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];
GetBitmapBits(m_hbm,bm.bmHeight*bm.bmWidthBytes,px);
GetObject(hbmBK,sizeof(BITMAP),&bmBK);
BYTE *pxBK=new unsigned char[bmBK.bmHeight*bmBK.bmWidthBytes];
GetBitmapBits(hbmBK,bmBK.bmHeight*bmBK.bmWidthBytes,pxBK);
rTransRect2=rTransRect;
OffsetRect(&rTransRect2,-rForeRect.left,-rForeRect.top);
int pb=bm.bmBitsPixel/8;
int pbBK=bmBK.bmBitsPixel/8;
int dx1,dx2,dy1,dy2;
for(dy1=rTransRect.top,dy2=rTransRect2.top;dy1<rTransRect.bottom;dy1++,dy2++)
for(dx1=rTransRect.left,dx2=rTransRect2.left;dx1<rTransRect.right;dx1++,dx2++)
{
int nBackRGB_B=dy1*bmBK.bmWidthBytes+dx1*pbBK;
int nForeRGB_B=dy2*bm.bmWidthBytes+dx2*pb;
if(RGB(px[nForeRGB_B+2],px[nForeRGB_B+1],px[nForeRGB_B])!=crTrans)
{
pxBK[nBackRGB_B]=(px[nForeRGB_B]*nAlpha+pxBK[nBackRGB_B]*
(256-nAlpha))/256;
pxBK[nBackRGB_B+1]=(px[nForeRGB_B+1]*nAlpha+pxBK[nBackRGB_B+1]*
(256-nAlpha))/256;
pxBK[nBackRGB_B+2]=(px[nForeRGB_B+2]*nAlpha+pxBK[nBackRGB_B+2]*
(256-nAlpha))/256;
}
}
SetBitmapBits(hbmTmp,bmBK.bmHeight*bmBK.bmWidthBytes,pxBK);
HBITMAP hbmOld=(HBITMAP)SelectObject(hdcMem,hbmTmp);
BitBlt(hdcBack,0,0,rBackRect.right,rBackRect.bottom,hdcMem,0,0,SRCCOPY);
delete[]px;
delete[]pxBK;
SelectObject(hdcMem,hbmOld);
}
DeleteObject(hbmTmp);
DeleteObject(hdcMem);
}
}