图像叠加问题,去掉maskcolor部分,以及半透明方式。

独醒子 2008-11-18 04:42:03

有两个bmp图片,比如放在两个Tbitmap中 分别是 A B
A图为背景图片
B图为前景图片 比如是一个人物,需要透明部分的是黑色(maskcolor=0)

问题一:
如何让B图叠加显示在A图上?即人物显示在背景图上,不显示人物周边的黑色(黑色是maskcolor需要透明)

问题二:
在问题一基础上实现B图的半透明效果,即Alpha混合。比如设置Alpha值为100.

请大侠给出详细代码。
为了处理速度,千万不要给我循环处理像素的方法。
谢谢,急等待。谢谢!
...全文
611 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyud 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lovezypj 的回复:]

问题都解决了也不结贴
[/Quote]

恩~
lovezypj 2010-08-10
  • 打赏
  • 举报
回复
问题都解决了也不结贴
独醒子 2008-12-09
  • 打赏
  • 举报
回复
我是 每图平均4-5张图片叠加 一共有约50图
也就是50×5=250张图需要处理
感觉太慢了。
ahjoe 2008-11-25
  • 打赏
  • 举报
回复
把象素访问改成用 ScanLine访问,速度会快很多。注意:不是每个点都去调用一次ScanLine,调用一次得为整行的象素处理服务。
jiju 2008-11-22
  • 打赏
  • 举报
回复
---------------------------
This function displays bitmaps that have transparent or semitransparent pixels.

BOOL AlphaBlend(
HDC hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int nHeightDest,
HDC hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
BLENDFUNCTION blendFunction
);


---------------------------
This function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.

BOOL TransparentBlt(
HDC hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int hHeightDest,
HDC hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
UINT crTransparent <--maskcolor
);


本来第一个函数应该可是实现你所讲的功能,但是要操作像素点,如果嫌麻烦,2个函数连用就可实现你的要求,第一个先半透名,第二个就把透明颜色屏蔽拷贝。。

操作像素点不是慢,是你没有直接对位图内存区域数值处理,至于你提到的and方式copy实际上只要搞一个蒙版位图,稍微处理一下,就可以把透明值消除了。
代码网上一把,自己去找吧
laviewpbt 2008-11-21
  • 打赏
  • 举报
回复
我可以肯定,240×320 这么小的图像,如果是5个混合,不管你是什么混合方式,以及透明度是多少,在一般的机器上不要0.2s。
laviewpbt 2008-11-21
  • 打赏
  • 举报
回复
这样的功能肯定是要一个一个像素的处理,系统中没有这类API
至于你所说的比较慢,可以肯定的告诉你,那是你的代码优化以及构建不良造成的。
android2008 2008-11-21
  • 打赏
  • 举报
回复
不懂,帮顶
独醒子 2008-11-21
  • 打赏
  • 举报
回复
谢谢你,不过我再等几天结帖。我还想知道是否有快速的方法实现图片叠加。
不是半透明而是有透明部分(maskcolor)

比如 一个是风景图片(背景图片) 一个是抠图后的人物图片(人物的背景是指定的maskcolor 比如是红色)

要求合成一个 背景图上有这个人物图(忽略maskcolor部分的叠加)

我现在的处理方式是像素方式,比较慢 因为要同时处理几十张图每张图要这样处理数张叠加。
我的方式太慢。希望有更快的方式。
如果没有,我过2天就结帖了。
xzhifei 2008-11-20
  • 打赏
  • 举报
回复
function IntToByte(i: Integer): Byte;
begin
if i > 255 then
Result := 255
else if i < 0 then
Result := 0
else
Result := i;
end;

procedure BmpAlphaBlend(var dBmp: TBitMap; sBmp: TBitmap; Pos: TPoint; Alpha: integer; TranColor: TColor = -1);
type
tagRGBTRIPLE = packed record
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;
TRGBTriple = tagRGBTRIPLE;
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..32767] of TRGBTriple;
function GetSLColor(pRGB: TRGBTriple): TColor;
begin
Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
end;
var
p0, p1: PRGBTripleArray;
r, g, b, p, x, y: Integer;
begin
sBmp.PixelFormat := pf24bit;
dBmp.PixelFormat := pf24bit;
if TranColor = -1 then
TranColor := sBmp.Canvas.Pixels[0, 0];
for y := 0 to sBmp.Height - 1 do
if (y + Pos.y >= 0) and (y + Pos.Y < dBmp.Height) then
begin
p0 := dBmp.ScanLine[y + Pos.y];
p1 := sBmp.ScanLine[y];
for x := 0 to sBmp.Width - 1 do
if (x + pos.X >= 0) and (x + Pos.X < dBmp.Width) then
if GetSLCOlor(p1[x]) <> TranColor then
begin
p0[x + pos.X].rgbtRed := IntToByte((p0[x + pos.X].rgbtRed * (100 - Alpha) +
p1[x].rgbtRed * Alpha) div 100);

p0[x + pos.X].rgbtGreen := IntToByte((p0[x + pos.X].rgbtGreen * (100 - Alpha) +
p1[x].rgbtGreen * Alpha) div 100);

p0[x + pos.X].rgbtBlue := IntToByte((p0[x + pos.X].rgbtBlue * (100 - Alpha) +
p1[x].rgbtBlue * Alpha) div 100);
end;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
brBmp, srcBmp: TBitmap;
begin
//
brBmp := TBitmap.Create;
brBmp.LoadFromFile('c:\a.bmp');
brBmp.PixelFormat := pf24bit;

srcBmp := TBitmap.Create;
srcBmp.LoadFromFile('c:\b.bmp');
srcBmp.PixelFormat := pf24bit;

BmpAlphaBlend(
brBmp, //背景图(大图,也是结果图)
srcBmp, //需要合成的小图
Point(60, 60), //画小图的坐标
100, //半透明度
-1//需要透明的颜色(用于不规则图形,-1就表示以0,0位置的颜色为透明色)
);

canvas.Draw(0, 0, brBmp);
brBmp.Free;
srcBmp.Free;
end;

独醒子 2008-11-20
  • 打赏
  • 举报
回复
难道这里没一个会处理图片的高手么?
独醒子 2008-11-19
  • 打赏
  • 举报
回复
像素的操作方法我已经知道,不过这个速度太慢了。我要同时处理几十张图(240×320)每张图可能是多张的叠加。
我希望寻找速度快点的方式 希望高手赐教 谢谢
panrongzeng 2008-11-18
  • 打赏
  • 举报
回复
要求挺高的啊,这不行那不行,到最后没办法了,看看有没有人满足你要求。
我帮你顶一下
独醒子 2008-11-18
  • 打赏
  • 举报
回复
忘了说 maskcolor不一定是黑色,用and方式copy是不可以的。

1,183

社区成员

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

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