请教颜色叠加的方法

Squall_zy 2010-06-12 10:56:08
使用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值得到颜色值
...全文
260 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
star__m 2010-10-09
  • 打赏
  • 举报
回复
借鉴一下~
Squall_zy 2010-06-15
  • 打赏
  • 举报
回复
to lvyexian:
Thank you very much! I'll try it.
lvyexian 2010-06-15
  • 打赏
  • 举报
回复
说明一下,这是我在一本资料书上看到的,DrawTransAlpha()函数的功能就是绘制通明镂空图,函数体代码中有2幅位图的叠加部分像素运算代码。

其中,
BYTE *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];语句是建立一个存储像素RGP值的数组


GetBitmapBits(m_hbm,bm.bmHeight*bm.bmWidthBytes,px);语句就是将位图像素存如PX[]数组中

这就是你需要的关键代码。
lvyexian 2010-06-15
  • 打赏
  • 举报
回复
不好意思,刚在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);
}
}
lvyexian 2010-06-15
  • 打赏
  • 举报
回复
哈哈,我正好有这个功能的源代码,但我现在在网吧上网,今天先留个底,下次给你贴代码
Squall_zy 2010-06-12
  • 打赏
  • 举报
回复
4楼能说细一些么?不胜感激
soswaidao 2010-06-12
  • 打赏
  • 举报
回复
分层~
Squall_zy 2010-06-12
  • 打赏
  • 举报
回复
交叉点是什么颜色,我可以计算出来,关键是绘图的过程,如何使用VC直接绘出这样的效果?
fandh 2010-06-12
  • 打赏
  • 举报
回复
楼主难道说的是透明度?
xiuxianshen 2010-06-12
  • 打赏
  • 举报
回复
你不是已经说完了么

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧