怎样使绘制的图片在背景上,产生具有透明的效果就是和背景融为一体(100分)

  • 主题发起人 主题发起人 hxy2002
  • 开始时间 开始时间
H

hxy2002

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样使绘制的图片在背景上,产生具有透明的效果就是和背景融为一体
 
不知你要的是什么效果:
1:将前景图按某颜色透明,使其悬浮在背景上?
2:将前景点距阵拉开,依稀透过背景?
另:
1:要算法;还是
2:只要实现就可。
 
如果图片有一种明显的透明色(如黑色为透明部分),可以用Canvas.Draw;
或者制作一个遮罩图片b.bmp,指明原图a.bmp中哪些是需要透明的,然后再使用CopyRect在底图上依次绘制遮罩和前景图,就可以实现透明贴图。
我这有示例程序,需要的话请来信说明!coolqiang@163.net
 
你说的是Alpha混合算法吧,Alpha可以将前景和背景色混合,从而实现半透明状态,这种算法需要将图像的每个点进行运算,运算量很大,以前我在VC中用汇编写过。
以下给你一段CnPack中由yygw写的Alpha绘图函数,基本方法都在里面了:
// Alpha混合绘制
procedure TCnBitmap.AlphaDraw(Src: TCnBitmap; Alpha: TCnAlpha;
Stretch: Boolean);
var
x, y, i: Integer;
c1, c2: PCnColor;
Table: array[-255..255] of Integer;
Bmp: TCnBitmap;
TranColor: TCnColor;
FAlpha: Integer;
begin
if Empty or not Assigned(Src) or Src.Empty then Exit;
FAlpha := AlphaToInt(Alpha);
if FAlpha = 0 then Exit;
Bmp := nil;
BeginUpdate;
try
Bmp := CheckAlphaSrc(Src, ClientRect, Stretch); // 处理源位图缩放
if FAlpha = 255 then
begin
Draw(0, 0, Bmp);
Exit;
end;

for i := -255 to 255 do // 建立Alpha混合表
Table := (FAlpha * i) shr 8;

c1 := Bits;
c2 := Bmp.Bits;
if (Bmp = Src) and Src.Transparent then // 源位图透明且未缩放(缩放时已处理过透明了)
begin
TranColor := Src.GetTranColor; // 混合时透明处理
for y := 0 to FHeight - 1 do
begin
for x := 0 to FWidth - 1 do
begin
if (TranColor.b <> c2.b) or (TranColor.g <> c2.g) or (TranColor.r <> c2.r)
then
begin
c1.b := Table[c2.b - c1.b] + c1.b; // 查表法快速混合
c1.g := Table[c2.g - c1.g] + c1.g;
c1.r := Table[c2.r - c1.r] + c1.r;
end;
Inc(c1);
Inc(c2);
end;
c1 := Pointer(Integer(c1) + Gap);
c2 := Pointer(Integer(c2) + Bmp.Gap);
end;
end
else
begin
for y := 0 to FHeight - 1 do
begin
for x := 0 to FWidth - 1 do
begin
c1.b := Table[c2.b - c1.b] + c1.b; // 查表法快速混合
c1.g := Table[c2.g - c1.g] + c1.g;
c1.r := Table[c2.r - c1.r] + c1.r;
Inc(c1);
Inc(c2);
end;
c1 := Pointer(Integer(c1) + Gap);
c2 := Pointer(Integer(c2) + Bmp.Gap);
end;
end;
finally
if Assigned(Bmp) and (Bmp <> Src) then Bmp.Free; // 释放临时位图
EndUpdate;
end;
end;
 
TO :yyii_yyii
我要将前景图按某颜色透明,使其悬浮在背景上?
算法和实现都要。
 
TO :yyii_yyii
先说简单的:
1:实现:用GDI的TransparentBlt函数即可
hdcCompatible = CreateCompatibleDC(NULL);
SelectObject(hdcCompatible, hBitmap);
TransparentBlt(hdc, //目标
x, //左
y, //上
bm.bmWidth,
bm.bmHeight,
hdcCompatible, //源
0,
0,
bm.bmWidth,
bm.bmHeight,
RGB(0xFF, 0xFF, 0xFF) //要透明的颜色);
}
DeleteObject(hBitmap);
DeleteDC(hdcCompatible);
2:算法程序太长,我就不写了,
基本上是这样的,
a:先将某格式的图转成DDB,
b:过滤掉DDB中的透明色(就是标记一下)。
c:画的时候将标记点的颜色画成背景的颜色即可。
 
用两个image不就行了
 
上面的都没有说到点子上,楼主所说的是类似photoshop的边界羽化功能: 我可以给你个提示,你最好先生成一个掩膜图,然后再做下面的工作
 
多人接受答案了。
 
后退
顶部