图象合并问题?

ghbh 2002-12-03 02:31:36
有一个视频捕捉窗和一个image(image里面放背景图片,图片掏空了一部分)。
视频捕捉窗里是从数码相机里得到的动态图象。现在我想要实现的功能是:把视频捕捉里
的动态图象显示在背景图片掏空的那一部分。我的思路是把视频捕捉窗和image设成一样大小视频捕捉窗放下面,image放上面,这样image中的图象就盖在视频捕捉窗中的图象上面了,image中的图片掏空的一部分就显示出动态图象了。现在问题是image放不到视频捕捉窗的上面,视频捕捉窗总是盖着image,请问这个问题如何解决?如果这个思路难以实现,有没有别的办法?
另:视频捕捉是用videocap控件,视频捕捉窗是videocap控件形成的。
...全文
68 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghbh 2002-12-10
  • 打赏
  • 举报
回复
zwjchina(蒲石) 你好:
谢谢你的代码,我刚才试了一下,不知道怎么回事,不是你说的镂反了,而是
镂的我也说不出来是什么形状,我怀疑我的图有问题,我用画图程序画了一个
黑圆圈和一个红圆圈,还是不行。
zwjchina 2002-12-09
  • 打赏
  • 举报
回复
var
Rg1, Rg2: HRGN;
Start: Boolean;
x, y: integer;
ARect: TRect;
begin
Start := False;
Rg1 := CreateRectRgn(0, 0, 0, 0);

for y := 0 to Image1.Height - 1 do //扫描每一行
begin
ARect.Top := y;
ARect.Bottom := y + 1;
for x := 0 to Image1.Width - 1 do //扫描每一行的每个象素
begin

if (Image1.Canvas.Pixels[x, y] <> $00000000) and (not Start) then
//如果点的颜色不为镂空颜色,并且没有开始记录非镂空区域
//则开始记录非镂空区域
begin
ARect.Left := x;
Start := True;
end;
if (Image1.Canvas.Pixels[x, y] = $00000000) and Start then
//如果该点是镂空颜色,并且已经开始记录非镂空区域,
//则完成非镂空区域的记录
begin
ARect.Right := x;
Start := False;
//上面已经生成了一个非镂空区域,创建该区域,并完成区域合并
Rg2 := CreateRectRgn(ARect.Left, ARect.Top,
ARect.Right, ARect.Bottom);
CombineRgn(Rg1, Rg1, Rg2, RGN_OR);
end;
//这个外层循环会导致每行的非镂空区域被合并进来,生成一个完整的
//不规则的非镂空区域
end;
end;
//设置Panel的有效区域,开始镂空Panel
SetWindowRgn(Panel1.Handle, Rg1, True);
end;

上面已经可以镂空了,不过镂反了,算法有问题,原理还是那样!你再改改算法吧!:)
zwjchina 2002-12-09
  • 打赏
  • 举报
回复
我测试一下!
ghbh 2002-12-09
  • 打赏
  • 举报
回复
刚才忘了,上面的是to zwjchina(蒲石)
zwjchina(蒲石) 你好:
上面的代码是我在你的代码基础上修改的(基本上没有做大的改动),你检查一下,我觉得应该没有什么问题了,可是一运行就把整个panel给镂空了。(在没有改动之前也是把整个panel给镂空了)不知道怎么回事?对了,图片镂空的地方我都设为了黑色。上面的代码中LColor:=clBlack。
ghbh 2002-12-07
  • 打赏
  • 举报
回复
var
Rg1, Rg2: HRGN;
Start: Boolean;
x, y, Top, Bottom, Left, Right: integer;
begin
Left := 0;
Right := 0;
Top := 0;
Bottom := 0;
Rg1 := CreateRectRgn(0, 0, 0, 0);
for y := 0 to Image.Height - 1 do //扫描每一行
begin
Start := False;
Top := y;
Bottom := y;
for x := 0 to Image.Width - 1 do //扫描每一行的每个象素
begin
if (Image.Canvas.Pixels[x, y] <> LColor) and (not Start) then
//如果点的颜色不为镂空颜色,并且没有开始记录非镂空区域
//则开始记录非镂空区域
begin
Left := x;
Start := True;
end;
if ((Image .Canvas.Pixels[x, y] = LColor) or
(x =Image.Width - 1)) and Start then
//如果该点是镂空颜色或者已经到行尾,并且已经开始记录非镂空区域,
//则完成非镂空区域的记录
begin
Right := x;
Start := False;
//上面已经生成了一个非镂空区域,创建该区域,并完成区域合并
Rg2 := CreateRectRgn(Left, Top, Right, Bottom);
CombineRgn(Rg1, Rg1, Rg2, RGN_OR);
end;
//这个外层循环会导致每行的非镂空区域被合并进来,生成一个完整的
//不规则的非镂空区域
end;
end;
//设置Panel的有效区域,开始镂空Panel
SetWindowRgn(Panel1.Handle, Rg1, True);
end;
zwjchina 2002-12-06
  • 打赏
  • 举报
回复
哈哈,信手写代码真的不行,修正如下(还是没有测试,只是修改了几处明显错误):
var
Rg1, Rg2: HRGN;
Start: Boolean;
x, y: integer;
begin
Rg1 := CreateRectRgn(0, 0, 0, 0);
for y := 0 to Image.Height - 1 do //扫描每一行
begin
Start := False;
ARect.Top := y;
ARect.Bottom := y;
for x := 0 to Image.Width - 1 do //扫描每一行的每个象素
begin
if (Image.Canvas.Pixels[x, y] <> LColor) and (not Start) then
//如果点的颜色不为镂空颜色,并且没有开始记录非镂空区域
//则开始记录非镂空区域
begin
ARect.Left := x;
Start := True;
end;
if ((Image .Canvas.Pixels[x, y] = LColor) or
(x =Image.Width - 1)) and Start then
//如果该点是镂空颜色或者已经到行尾,并且已经开始记录非镂空区域,
//则完成非镂空区域的记录
begin
ARect.Right := x;
Start := False;
//上面已经生成了一个非镂空区域,创建该区域,并完成区域合并
Rg2 := CreateRectRgn(ARect.Left, ARect.Top,
ARect.Left, ARect.Right);
CombineRgn(Rg1, Rg1, Rg2, RGN_OR);
end;
//这个外层循环会导致每行的非镂空区域被合并进来,生成一个完整的
//不规则的非镂空区域
end;
end;
//设置Panel的有效区域,开始镂空Panel
SetWindowRgn(Panel1.Handle, Rg1, True);
end;
zwjchina 2002-12-06
  • 打赏
  • 举报
回复
我说2句,你可以去试试看。

在视频捕捉窗上面放Panel,而不是Image

再在这个Panel上放Image。

首先Image中装入图,该图要符合一定的条件,
就是图需要镂空的地方都为某一特定颜色,如果不符合条件,你把图加工一下就可以了。

放好了,再就是写程序了。

根据Image.Canvas中点的颜色来创建一个区域。

例如:假设要镂空的地方的颜色是,LColor;
var
Rg1, Rg2: HRGN;
Start: Boolean;
x, y: integer;
begin
Start := False;
Rg1 := CreateRectRgn(0, 0, 0, 0);
for y := 0 to Image.Height - 1 do //扫描每一行
begin
ARect.Top := y;
ARect.Bottom := y;
for x := 0 to Image.Width - 1 do //扫描每一行的每个象素
begin
if (Image.Canvas.Pixels[x, y] <> LColor) and (not Start) then
//如果点的颜色不为镂空颜色,并且没有开始记录非镂空区域
//则开始记录非镂空区域
begin
ARect.Left := x;
Start := True;
end;
if (Image .Canvas.Pixels[x, y] = LColor) and Start then
//如果该点是镂空颜色,并且已经开始记录非镂空区域,
//则完成非镂空区域的记录
begin
ARect.Right := x;
Start := False;
//上面已经生成了一个非镂空区域,创建该区域,并完成区域合并
Rg2 := CreateRectRgn(ARect.Left, ARect.Top,
ARect.Left, ARect.Right);
CombineRgn(Rg1, Rg1, Rg2, RGN_OR);
end;
//这个外层循环会导致每行的非镂空区域被合并进来,生成一个完整的
//不规则的非镂空区域
end;
end;
//设置Panel的有效区域,开始镂空Panel
SetWindowRgn(Panel1.Handle, Rg1, True);
end;

以上代码只是随手写的,可能有问题,但是大致应该就是这样了
ghbh 2002-12-06
  • 打赏
  • 举报
回复
你好:
非常感谢你的帮助,我看了你的代码,我还没有上机试验,不过你的办法很好
我想确定一下以下代码是不是有错误:
Rg2 := CreateRectRgn(ARect.Left, ARect.Top,
ARect.Left, ARect.Right);//参数是不是错误
ARect是不是个记录体?
谢谢。
ghbh 2002-12-05
  • 打赏
  • 举报
回复
to newyj:
不行,视频捕捉窗是方的,有很多背景图片,掏空的位置都不一样,掏空的形状
也都不一样,这样两个图在一块不自然。
newyj 2002-12-05
  • 打赏
  • 举报
回复
只要image比视频捕捉窗大就行了。
ghbh 2002-12-05
  • 打赏
  • 举报
回复
to newyj:
我需要在背景图片掏空的那一部分中看到动态图象(动态图象主要是人像,人需要根据背景图摆姿势,然后拍照)image放到下面就无法看到背景了。
ghbh 2002-12-05
  • 打赏
  • 举报
回复
高手们帮帮忙吧,提供个思路也行
newyj 2002-12-04
  • 打赏
  • 举报
回复
image放到下面,需要保存图像的时候,把视频捕捉窗的图像画到imgage里就行了
ghbh 2002-12-04
  • 打赏
  • 举报
回复
csdn不知道怎么回事,管理窗口和浏览窗口内容不一样,只好重写:

有一个视频捕捉窗和一个image(image里面放背景图片,图片掏空了一部分)。
视频捕捉窗里是从数码相机里得到的动态图象。现在我想要实现的功能是:把视频捕捉里
的动态图象显示在背景图片掏空的那一部分。我的思路是把视频捕捉窗和image设成一样大小视频捕捉窗放下面,image放上面,这样image中的图象就盖在视频捕捉窗中的图象上面了,image中的图片掏空的一部分就显示出动态图象了。现在问题是image放不到视频捕捉窗的上面,视频捕捉窗总是盖着image,请问这个问题如何解决?如果这个思路难以实现,有没有别的办法?
另:视频捕捉是用videocap控件,视频捕捉窗是videocap控件形成的。

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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