图像透明中,Alpha的值是怎么来的?

J_gaorui 2008-01-07 09:19:33
如题,我想知道
result = ALPHA * srcPixel + ( 1 - ALPHA ) * destPixel
或者
alpha取值在[0,1]之间,0代表完全透明,1代表完全不透明
如果alpha取值在[0,255],公式改成
R = (R(a)*alpha + R(b)*(255-alpha))/255

中Alpha如何得来的。另外,如果用BitBlt方法来实现透明和AlphaBlender的方法实现透明谁能提供和demo看看,谢谢
...全文
716 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
J_gaorui 2008-01-08
  • 打赏
  • 举报
回复
今天我试了下用Timage.canvas.Pen.Mode:=pmMask;也可以实现一个Rect在图片上透明
请问这样做有什么区别吗?似乎更简单了。

同时感谢Dext提供的代码。我开始也是和你一样实现的,但是你的更工整了很多,呵呵
Henry.6 2008-01-08
  • 打赏
  • 举报
回复
学习
dext 2008-01-08
  • 打赏
  • 举报
回复
没有优化,仅供参考。

procedure TForm1.FormPaint(Sender: TObject);
var
AShadowBitmap: TBitmap;
A1stBitmap: TBitmap;
A2ndBitmap: TBitmap;
Alpha: Byte;
r, c: Integer;
begin
AShadowBitmap:= TBitmap.Create;
A1stBitmap:= TBitmap.Create;
A2ndBitmap:= TBitmap.Create;
try

AShadowBitmap.Height:= 200;
AShadowBitmap.Width:= 300;
A1stBitmap.Height:= AShadowBitmap.Height;
A1stBitmap.Width:= AShadowBitmap.Width;
A2ndBitmap.Height:= AShadowBitmap.Height;
A2ndBitmap.Width:= AShadowBitmap.Width;

A1stBitmap.Canvas.Pen.Width:= 10;
A1stBitmap.Canvas.Pen.Color:= clRed;
A1stBitmap.Canvas.MoveTo(0, 0);
A1stBitmap.Canvas.LineTo(300, 200);

A2ndBitmap.Canvas.Pen.Width:= 10;
A2ndBitmap.Canvas.Pen.Color:= clBlue;
A2ndBitmap.Canvas.MoveTo(0, 200);
A2ndBitmap.Canvas.LineTo(300, 0);

Alpha:= 200;
for r:= 0 to AShadowBitmap.Height - 1 do begin
for c:= 0 to AShadowBitmap.Width - 1 do begin
AShadowBitmap.Canvas.Pixels[c, r]:=
Round(Alpha / 255 * A1stBitmap.Canvas.Pixels[c, r] + (1 - Alpha / 255) * A2ndBitmap.Canvas.Pixels[c, r]);
end;
end;

Canvas.Draw(0, 0, A1stBitmap);
Canvas.Draw(A1stBitmap.Width + 10, 0, A2ndBitmap);
Canvas.Draw(0, A1stBitmap.Height + 10, AShadowBitmap);
finally
FreeAndNil(A2ndBitmap);
FreeAndNil(A1stBitmap);
FreeAndNil(AShadowBitmap);
end;
end;
dext 2008-01-08
  • 打赏
  • 举报
回复
这个问题不难,用影子位图,将两幅图用自己的算法画在影子位图上,然后BitBlt影子位图到DC上。
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
逐点计算后的结果感觉不对,我曾经用饭桶大哥的那个逐点计算画了后,效果不好,比如前景色是红色的背景色是白色的就没透明感。另我这有个程序可以做到很好的透明色,但是偶不知道他如何做到的,如果可以的话,请你帮我看看
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
jinjazz 还有maozefa大哥,你们有联系方式不?我的是j_gaorui@hotmail.com或者QQ:19867087,希望能得到你们的指点和交流
阿发伯 2008-01-07
  • 打赏
  • 举报
回复
在TImage上直接用GDI+画透明图像可能不行,你可以用你前面的那个公式对TImage的位图与TImage的背景逐点计算后刷新。
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
我的AlphaBlend,dbmp是背景TBitMap,sbmp是在背景上覆盖的并且能半透明的TBitMap

bf.BlendOp:=AC_SRC_OVER;
bf.BlendFlags:=0;
bf.SourceConstantAlpha:=$7f;
bf.AlphaFormat:=0;
Windows.AlphaBlend(dbmp.Canvas.Handle,0,0,dbmp.Width,dbmp.Height,sbmp.canvas.Handle,0,0,sbmp.Width,sbmp.Height,bf);

运行没结果,嘿嘿,我是不是照葫芦画瓢画错了呀?

J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
一种是用AlphaBlend的Alpha通道,不知道算不算GDI+,应该算吧,和jinjazz贴的原理似乎一样

还有就是用封装好的GDI+控件,阿发伯的应该是那样吧

还有就是用BitBlt做两次运算

不知道我说的对不对,但是这上面说的都是我从网上找的,但是每种方法的实现我还是糊里糊涂
jinjazz 2008-01-07
  • 打赏
  • 举报
回复
不好意思..帖错了,不用gid+是无法实现透明的吧,
我想贴的地址是
http://blog.csdn.net/jinjazz/archive/2007/11/01/1860437.aspx
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
To jinjazz(近身剪):
这个地址似乎是本帖地址

To maozefa(阿发伯):
谢谢,你的所有帖子偶都看过了哟。但是很抱歉,我不能调用gdi+,因为我们是自己在Image上画图操作的,我不知道gdi+可否在Image上有Delphi原来TImage一样的操作,如MouseMove,PolyLine....等等,你能告诉我吗?
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
To jinjazz(近身剪):
这个地址似乎是本帖地址

To maozefa(阿发伯):
谢谢,你的所有帖子偶都看过了哟。但是很抱歉,我不能调用gdi+,因为我们是自己在Image上画图操作的,我不知道gdi+可否在Image上有Delphi原来TImage一样的操作,如MouseMove,PolyLine....等等,你能告诉我吗?
阿发伯 2008-01-07
  • 打赏
  • 举报
回复
Alpha自己确定的图像像素在目标上的比例。

使用GDI+可以很轻松的进行透明显示,可参见我的BLOG文章:

GDI+ 在Delphi程序的应用 -- 图像的透明显示技巧
jinjazz 2008-01-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080107/09/97469d01-85b4-4aa6-8122-0b359405f201.html
J_gaorui 2008-01-07
  • 打赏
  • 举报
回复
偶弄定了,呵呵,谢谢2位。如果方便的话留个联系方式阿,有问题好直接请教了,会图像处理的高手好少,如果你们有非法组织,帮派什么的(QQ群或者其他类似)可以让我加入一个吗?
jinjazz 2008-01-07
  • 打赏
  • 举报
回复
>>SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED or WS_EX_CONTROLPARENT)

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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