游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2553|回复: 2

透明位图处理的迷津

[复制链接]

5

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-8-14 00:17:00 | 显示全部楼层 |阅读模式
先向各位前辈们打声招呼 @@
今天在实作合成图片的时候 思路有点被绊着
假设现在有图A 图B 我想把图S合成到图B内 所以在图A设定了透明色
我单纯地认为只要跑一个回圈 用判断式子每一个 这样地去与透明色判断
!=TransColor - >绘制
==TransColor -> 放弃绘图
奈何 我在找了很久都找不到一个能截取图片的函数 ( 最重要的是自己不会写这样的截取东东 ~~~ %~%)

这个是问题一 请问能提供一下截取图片的函数吗 ? ^^

问题二是这样的
由于自己的办法行不通 我上网去参考前辈们的程式

得到了下面的一段代码 : ( 成功运作 )
由于没有注解 我只能尽可能地猜想 现在将我的想法括于下

/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
CRect &rect 指定位图在pDC中的位置 ( 应该吧 自己也不知道)
COLORREF rgbMask 位图的透明色
*/

void CBCGTestView:rawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
{
BITMAP BM;
CDC ImageDC,MaskDC;

CBitmap Image,*pOldImage;
CBitmap maskBitmap,*pOldMaskDCBitmap ;

Image.LoadBitmap(IDImage); // 载入图片并且初始 建立相容记忆块
ImageDC.CreateCompatibleDC(pDC); //
pOldImage=ImageDC.SelectObject(&Image);

Image.GetObject(sizeof(BM),&BM);

MaskDC.CreateCompatibleDC(pDC);
// 动态制作一个单色(黑白)的遮罩 对应于Image图片的遮罩图

maskBitmap.CreateBitmap( BM.bmWidth, BM.bmHeight, 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

ImageDC.SetBkColor(rgbMask); // 从这里开始有点模糊

/* 问题三 : 请问SetBkColor 的用途是什么
     上说是设置背景色
     可系统自己就可以分辨出背景与前景的不同吗 ?
     而且在原欲合成图中 不是已用了透明色填满了需要作透明处理的背景吗 ?
现在这段是多余的吗 ? 我曾尝试删除这段 可这样一来 程式就不行正确运作了



盼指导 */

/* 思考一 : 如果系统真的能自己判断背景的话 那其实 只要SetBkColor(Transparent) 不就可以了吗 ? 接下来就直接SRCCOPY . >< .... */


MaskDC.BitBlt( 0, 0, BM.bmWidth, BM.bmHeight, &ImageDC, 0, 0, SRCCOPY );

ImageDC.SetBkColor(RGB(0,0,0));

// 这里有点不认同
如果这样的话 背景色黑色与前景色白色
不就直接盖过了原图吗 ? 那接下来又如何在合成的作品中有原图的影子呢 ? <<由于已被盖过

ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, BM.bmWidth, BM.bmHeight, &MaskDC, 0, 0, SRCAND);

pDC->BitBlt(0,0,BM.bmWidth, BM.bmHeight, &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(0,0,BM.bmWidth, BM.bmHeight, &ImageDC, 0, 0,SRCPAINT);

MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}

大部份的步骤我 想了很久 应该可以简括如下
一) 参考原图建立黑白遮罩
二) 以遮罩修改原图 SRCAND
三) 以遮罩修改背景图 SRCAND
四) 以被修改过的原图与修改过的背景图输出合成图 SRCPAINT

困惑一 : 对于AND我多少有点粗略的认知
由于是AND COLOR BITS.

BLACK = 0,0,0
Therefore, Bits Is Equivalent to All 0's.
White=255,255,255
Therefore Bits Is Equivalent to Aall 1's

ANDing 1 & 0 -> 零
可原图中并没有特定的黑色跟白色啊
那这样的AND 不就没意义了吗 ? << 不能使黑白 到白 没有一个准则 ><

---------------------------不知所谓的问题的结束-----------------------------------------
谢谢大家抽空
祝 安康 ^^

2

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2005-8-14 02:13:00 | 显示全部楼层

Re:透明位图处理的迷津

pDC->BitBlt(0,0,BM.bmWidth, BM.bmHeight, &MaskDC, 0, 0, SRCAND);

这样的话,mack应该是欲透明的部分为白色(FFFFFF)
于是:
任何颜色 和这个mask 和(and)了以后,白色的地方保留,黑色的地方变成黑色。
如:两个红色 和 左黑右白的mask 进行 and
       110000 110000     (source)
  &   000000 111111     (destination)
-------------------------------
       000000 110000
         黑         红    <-------------结果

下面再 进行 OR
pDC->BitBlt(0,0,BM.bmWidth, BM.bmHeight, &ImageDC, 0, 0,SRCPAINT);
同样的道理,目标黑的地方,将被源覆盖,而源黑色的地方,目标的颜色将保留。于是就有了
透明。

如果是简单应用,可以考虑使用 TransparentBlt

8

主题

239

帖子

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2005-8-15 11:15:00 | 显示全部楼层

Re:透明位图处理的迷津

看的头都大,咋不用现成的alpha混合
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 10:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表