AlphaBlend与TransparentBlt能组合使用

Milionking 2009-10-20 08:19:02
在另一高手的指导下学会了用双兼容的方式组合着用AlphaBlend与TransparentBlt,但效果上达不到预期

的效果,我本来是想让一个图片的红色透明化,然后让这处理后的图片半透明化,但结果是本来该透明化

的红色变为黑色出现了,代码如下,求高手指导。

BLENDFUNCTION bl;
bl.BlendOp=AC_SRC_OVER;
bl.BlendFlags=0;
bl.AlphaFormat=0;
bl.SourceConstantAlpha=100;

CDC m_cdc2;
CDC *pwnd = GetDC();
CBitmap m_bitmap2;
m_cdc2.CreateCompatibleDC(pwnd);
m_bitmap2.LoadBitmap(IDB_TRUE4);
CBitmap *oldbitmap2 = m_cdc2.SelectObject(&m_bitmap2);
CDC mDC;
mDC.CreateCompatibleDC(&m_cdc2);
CBitmap m_bitmap;
m_bitmap.CreateCompatibleBitmap(&m_cdc2,150,150);
mDC.SelectObject(&m_bitmap);
TransparentBlt(mDC.m_hDC,0,0,150,150,m_cdc2.m_hDC,0,0,150,150,RGB(255,0,0));//=============

这个能使图片的一个颜色透明
AlphaBlend(pwnd->m_hDC,0,0,150,150,mDC.m_hDC,0,0,150,150,bl);//=============这个能使图半透明
m_cdc2.SelectObject(oldbitmap2);
...全文
290 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Milionking 2009-10-21
  • 打赏
  • 举报
回复
嗯。。你能帮我想到解决的方法已经很好了。。谢谢你了喔。
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
等于现在有个计算题目:已知目标图颜色为白色(这个可以事先固定,也可用其他颜色),以及需要进行半透明的颜色值,在指定透明度下将透明成什么颜色?
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
请注意红色的两段。一是要给内存DC指定背景色,这里用白色,然后对应的在透明的时候用RGB(255,155,155),此时bl.SourceConstantAlpha=100;
这里只是解决bl.SourceConstantAlpha=100的情况,当不为100时,你的图片半透明后,背景的红色会变为浅红色,但具体浅到哪个RGB值,和这个SourceConstantAlpha的值是否有对应的计算关系,目前还没有搞清楚。
也就是说,在白色底,SourceConstantAlpha为100的情况下,红色可以半透明成RGB(255,155,155)这个颜色。然后只需要透明掉这个颜色就达到目标了。现在需要进一步研究的是前三种是否有必然的公式存在。
当然,其他高手们或许还有更简单的方案。那就另说了。
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
暂时解决了一下,可以达到效果。其实就是再增加两句话。
void CMyDlg::ShowTrueImage()
{

BLENDFUNCTION bl;
bl.BlendOp=AC_SRC_OVER;
bl.BlendFlags=0;
bl.AlphaFormat=0;
bl.SourceConstantAlpha=100;

CDC m_cdc2;
CDC *pwnd = GetDC();
CBitmap m_bitmap2;
m_cdc2.CreateCompatibleDC(pwnd);
m_bitmap2.LoadBitmap(_T(str_array.GetAt(the_TNumber+4)));
CBitmap *oldbitmap2 = m_cdc2.SelectObject(&m_bitmap2);

CDC mDC;
mDC.CreateCompatibleDC(pwnd);
CBitmap m_bitmap;
m_bitmap.CreateCompatibleBitmap(pwnd,150,150);
mDC.SelectObject(&m_bitmap);
mDC.FillSolidRect(0,0,150,150,RGB(255,255,255));     AlphaBlend(mDC.m_hDC,0,0,150,150,m_cdc2.m_hDC,0,0,150,150,bl);//使图片半透明
m_cdc2.SelectObject(oldbitmap2);

TransparentBlt(pwnd->m_hDC,50,50,150,150,mDC.m_hDC,0,0,150,150,RGB(255,155,155));//使背景透明

}
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
你有倒分的嫌疑,请不要再给你的二号马甲倒分了。一经发现,马上关小屋一个月。
jyh_baoding 2009-10-20
  • 打赏
  • 举报
回复
帮顶
Milionking 2009-10-20
  • 打赏
  • 举报
回复
谢谢你帮我喔,已发至你的邮箱了。
快乐鹦鹉 2009-10-20
  • 打赏
  • 举报
回复
那你把工程发给我。happyparrot@126.com。要能编译运行的
Milionking 2009-10-20
  • 打赏
  • 举报
回复
喔。。如果有这样规定的啊。。我是菜鸟。。如果这样不行的啊。。我想着都没人答,就拿回来再出贴摆了。
是了。。你又说帮我测试一下的?。。我已等到你不是周末时间的了喔。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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