
delphi的canvas太慢怎么办
我想用Canvas.Pixels通过对特别颜色透明来将一个图像合成到另一个图像,便例如:fory:=0toimage2.Picture.Height-1doforx:=0...
我想用Canvas.Pixels通过对特别颜色透明来将一个图像合成到另一个图像,便例如:
for y:=0 to image2.Picture.Height-1 do
for x:=0 to image2.Picture.Width-1 do
if image2.Canvas.Pixels[ix,iy]<>$FF00FF then
image1.Canvas.Pixels[x,y]:=image2.Canvas.Pixels[x,y];
但是太慢了,有什么其它的办法可以解决?
回答者: 381560388,你的回答我很喜欢,但是我的程序的两个图像是不同大小的,合成的位置也要求可控。所以我想可不可以在
imageP1^:=imageP2^;
inc(imageP1);
inc(imageP2);
这里对大的一个图片的指针做些计算,但我不会。这是目前我的解决方案,也ScanLine的,但是很蹩脚。
var
ix,iy,tem:integer;
pixcolo,pixcolo2:PBytearray;
....
for iy:=0 to imaget2.Height-1 do begin
pixcolo:=imaget2.ScanLine[iy];
pixcolo2:=form1.image1.Picture.Bitmap.ScanLine[iy+y]; //这里的y和下面的x指定图像合成的位置
for ix:=0 to imaget2.Width-1 do begin
tem:=ix*3;
if (pixcolo[tem]*$10000+pixcolo[tem+1]*$100+pixcolo[tem+2])<>$FF00FF then begin
pixcolo2[tem+x*3]:=pixcolo[tem];
pixcolo2[tem+x*3+1]:=pixcolo[tem+1];
pixcolo2[tem+x*3+2]:=pixcolo[tem+2];
end;
end;
end; 展开
for y:=0 to image2.Picture.Height-1 do
for x:=0 to image2.Picture.Width-1 do
if image2.Canvas.Pixels[ix,iy]<>$FF00FF then
image1.Canvas.Pixels[x,y]:=image2.Canvas.Pixels[x,y];
但是太慢了,有什么其它的办法可以解决?
回答者: 381560388,你的回答我很喜欢,但是我的程序的两个图像是不同大小的,合成的位置也要求可控。所以我想可不可以在
imageP1^:=imageP2^;
inc(imageP1);
inc(imageP2);
这里对大的一个图片的指针做些计算,但我不会。这是目前我的解决方案,也ScanLine的,但是很蹩脚。
var
ix,iy,tem:integer;
pixcolo,pixcolo2:PBytearray;
....
for iy:=0 to imaget2.Height-1 do begin
pixcolo:=imaget2.ScanLine[iy];
pixcolo2:=form1.image1.Picture.Bitmap.ScanLine[iy+y]; //这里的y和下面的x指定图像合成的位置
for ix:=0 to imaget2.Width-1 do begin
tem:=ix*3;
if (pixcolo[tem]*$10000+pixcolo[tem+1]*$100+pixcolo[tem+2])<>$FF00FF then begin
pixcolo2[tem+x*3]:=pixcolo[tem];
pixcolo2[tem+x*3+1]:=pixcolo[tem+1];
pixcolo2[tem+x*3+2]:=pixcolo[tem+2];
end;
end;
end; 展开
展开全部
你这么写不慢才怪
不是canvas慢,你用的这个方法不是来做这个的.你可不要小看delphi vcl中封装的东西 canvas的Draw方法你觉得慢吗?
你不用将图像数据装载到流中,不划算因为图像数据已经在内存中了只要我们直接操作即可
给你写一个例子: (可不是复制粘贴的哦!)
var
imageP1,imageP2:^TColor;
i:integer;
begin
with Image1.Picture.Bitmap do
begin
PixelFormat:=pf32bit;
imageP1:=ScanLine[Height-1];
end;
with Image2.Picture.Bitmap do
begin
PixelFormat:=pf32bit;
imageP2:=ScanLine[Height-1];
end;
for i:= 0 to (Image2.Width * Image2.Height)-1 do
begin
if imageP2^ <> $FF00FF then
imageP1^:=imageP2^;
inc(imageP1);
inc(imageP2)
end;
image1.Refresh;
end;
达到的效果跟你上面的一样,前提是两个image图片宽高要相同,还有需要Bmp图片
但是速度绝对快比你那么写快NNNN倍
只要你懂得怎么用指针就可以将我给你的例子弄完美,要是想做图像处理相关的最好用指针,指针会很好的提高你程序的效率因为直接操作内存
vcl封装的的确很好但是很多菜鸟在不怎么了解Vcl原理的情况下胡乱使用,
比如在循环里面使用了某些可视控件的一个方法导致N次的不必要的重画(我笑!不慢才怪)所以delphi爱好者一定要在vcl中摄取营养终有一天你会发现delphi与VC是一个级别的
不是canvas慢,你用的这个方法不是来做这个的.你可不要小看delphi vcl中封装的东西 canvas的Draw方法你觉得慢吗?
你不用将图像数据装载到流中,不划算因为图像数据已经在内存中了只要我们直接操作即可
给你写一个例子: (可不是复制粘贴的哦!)
var
imageP1,imageP2:^TColor;
i:integer;
begin
with Image1.Picture.Bitmap do
begin
PixelFormat:=pf32bit;
imageP1:=ScanLine[Height-1];
end;
with Image2.Picture.Bitmap do
begin
PixelFormat:=pf32bit;
imageP2:=ScanLine[Height-1];
end;
for i:= 0 to (Image2.Width * Image2.Height)-1 do
begin
if imageP2^ <> $FF00FF then
imageP1^:=imageP2^;
inc(imageP1);
inc(imageP2)
end;
image1.Refresh;
end;
达到的效果跟你上面的一样,前提是两个image图片宽高要相同,还有需要Bmp图片
但是速度绝对快比你那么写快NNNN倍
只要你懂得怎么用指针就可以将我给你的例子弄完美,要是想做图像处理相关的最好用指针,指针会很好的提高你程序的效率因为直接操作内存
vcl封装的的确很好但是很多菜鸟在不怎么了解Vcl原理的情况下胡乱使用,
比如在循环里面使用了某些可视控件的一个方法导致N次的不必要的重画(我笑!不慢才怪)所以delphi爱好者一定要在vcl中摄取营养终有一天你会发现delphi与VC是一个级别的
展开全部
用这个方法:把image的位图图像转到内存里,就是stream里,再来处理就可以了,这个速度就很快了,你如果用FOR来处理Canvas的话,有时候会出现白图的情况
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
381560388的意思无非就是让用ScanLine,这个将返回一个指针,如果你对指针不熟悉,那么根本不是马上可以掌握ScanLine的使用方法的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询