图像透明算法

?

转贴:
图像透明 算法
如何通过算法设置出象photoshop里一幅图象在另一幅图象上如何透明 地显示,
并且可以设置透明度,如50%的透明度。并不是单幅图象的透明 性。

BCB(:)) (2001-1-1 15:15:00) 得0分

Tbitmap有关的属性:

1.TansparentColor: 透明 色;

2.PixelFormat:指明每一象点颜色所占的二进位数;

pf16bit: 点2字节;

pf24bit: 3字节;

pf32bit: 4字节;

3.ScanLine[行号];每一行象素缓冲的首址,即数组

的首址,每一象点占连续字节;

有了上面的3个属性,就可以写出合成2幅图象的算法;

算法:

for 第0行 到 最后一行

for 第0列 TO 最后一列

begin

1.取第一幅一个象点c1;

2.取第二幅一个象点c2;

3.如果c1是透明 色,c3:=c2;

如果c2是透明 色,c3:=c1;

4.送c3

end

 

nononono(null,null) (2001-1-1 20:01:00) 得0分

我有个效率不高(速度很慢),但效果绝对好的算法:

 

for 第0行 到 最后一行

for 第0列 TO 最后一列

begin

1.取第一幅一个像点c1的R色 c1R;

2.取第二幅一个像点c2的R色 c2R;

3.新像点的R色 cR := (c1R*K+c2R*(1-K));

4.取第一幅一个像点c1的G色 c1G;

5.取第二幅一个像点c2的G色 c2G;

6.新像点的G色 cG := (c1G*K+c2G*(1-K));

7.取第一幅一个像点c1的B色 c1B;

8.取第二幅一个像点c2的B色 c2B;

9.新像点的B色 cB := (c1B*K+c2B*(1-K));

10.新像点的RGB色 cRGB := RGB(cR,cG,cB);

end

 

其中 K 是2个图合并时,第一幅图的权重。改变这个 K 值可以得到一个渐变的效果。

jz_x(北风) (2001-1-2 15:04:00) 得0分

可将下面代码转换为DELPHI代码就可:

CDC memDC;

CBitmap &cBitmap=m_bmpDraw;

CBitmap* pOldMemBmp = NULL;

COLORREF col,colMask;

CRect cRect;

int x, y;

CRgn wndRgn, rgnTemp;

GetWindowRect(&cRect);

CPoint ptOrg=cRect.TopLeft();

BITMAP bmInfo;

cBitmap.GetObject(sizeof(bmInfo),&bmInfo);

CRect rcNewWnd=CRect(ptOrg,CSize(bmInfo.bmWidth,bmInfo.bmHeight));

memDC.CreateCompatibleDC(pDC);

pOldMemBmp = memDC.SelectObject(&cBitmap);

colMask=memDC.GetPixel(0,0);

wndRgn.CreateRectRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());

for(x=0; x<=rcNewWnd.Width(); x++)

{

for(y=0; y<=rcNewWnd.Height(); y++)

{

col = memDC.GetPixel(x, y);

if(col == colMask)

{

rgnTemp.CreateRectRgn(x, y, x+1, y+1);

wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);

rgnTemp.DeleteObject();

}

}

}

if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);

SetWindowRgn((HRGN)wndRgn, TRUE);

MoveWindow(rcNewWnd);

lingweitao(涛生) (2001-1-2 16:48:00) 得0分

呵呵!看来这些人没明白你的意思呀!我曾经研究过这个问题,不过我是用VC做的,不知道用DELPHI怎么做,不过我可以把算法告诉你:取得两幅为图在每一点的像素值,分离出R,G,B的值,生成位图相应像素的R,G,B由下面公式决定:R=kR1+(1-k)R2 G=kG1+(1-k)G2 B=kB1+(1-k)B2 k为透明度,范围是0%-100% ,R1,R2,G1,G2,B1,B2为混合的两幅位图分离出来的R,G,B值,R,G,B为混合后的相应像素的R,G,B值。

APIer(APIer) (2001-1-2 17:01:00) 得0分

使用DDraw吧,这是一个简单的Alpha特效啊。

nononono的方法是可行的,但是使用了太多的乘法,还要用到浮点,在16位位图游戏编程中,大家通常使用这样的方法来进行Alpha混合:

1先分色并移位

2进行混色:(混色深度为32,足够了)

DestColor= (RscColor-DestColor)*Alpha_Depth〉〉5+DestColor;(R.G.B分别计算)

3最后合色

欢迎到我的业余游戏制作主页看看,上面有相关的文章:http://calfsoft.51.net

我的Email:APIer@cmmail.com

nononono(null,null) (2001-1-7 12:39:00) 得0分

akuan,这样试试:

分离RGB3色用"位与"、"移位"运算的方法;

透明 的比例按 32、16分级。

如:如果是按32级,

A图的权重 K = n/32,则B图的权重 = (32-n)/32,

可以得到这样的算法:

cR := (c1R*n+c2R*(32-n));

再对cR右移4位。

 

这样的算法要快很多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值