使用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值得到颜色值
第一次画了一条红色的线;
第二次画了一条绿色的线;
这两条线段有交叉点。
问:如何使交叉点为“叠加色”?(注:现在交叉点被覆盖成绿色了)叠加色的计算公式应用别人的方法:
第一步:分解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值得到颜色值
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);
}
}
BYTE *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];语句是建立一个存储像素RGP值的数组而
GetBitmapBits(m_hbm,bm.bmHeight*bm.bmWidthBytes,px);语句就是将位图像素存如PX[]数组中这就是你需要的关键代码。
Thank you very much! I'll try it.