图像透明算法

  • 主题发起人 主题发起人 import
  • 开始时间 开始时间
I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
如何通过算法设置出象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位。
 
这样的算法要快很多。
 
 

Similar threads

I
回复
0
查看
645
import
I
I
回复
0
查看
434
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部