怎么比较两个Tbitmap的图像是否完全相同 ( 积分: 23 )

  • 主题发起人 主题发起人 zjrivaldo
  • 开始时间 开始时间
Z

zjrivaldo

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个长宽想等的两个图像存在Tbitmap里面,我现在怎么比较他们两个图像是否完全想同?最好给出例子,谢谢
 
我有两个长宽想等的两个图像存在Tbitmap里面,我现在怎么比较他们两个图像是否完全想同?最好给出例子,谢谢
 
scanline比较,或者保存为memorystream按字节比较
 
scanline比较,怎么比较啊?比较象素RGB值吗?
 
可以直接比较每个象素的RGB值。
 
先把它们转换成Bmp格式
然后
var
dx,dy:integer;

begin
for dx:=0 to Image1.Picture.Bitmap.Width-1 do
for dy:=0 to Image1.Picture.Bitmap.Height-1 do
if Image1.Picture.Bitmap.Canvas.Pixels[dx,dy]<>Image2.Picture.Bitmap.Canvas.Pixels[dx,dy] then
begin
showmessage('两幅图像不相同!');
exit;
end;
showmessage('两幅图像相同!');
end;
 
上面wanghaiou的速度与scanline比较和保存为memorystream按字节比较这三种方法,那种速度更快呢?还有没有效率最好的办法??
 
scanline的速度,
速度大约快Image2.Picture.Bitmap.Canvas.Pixels二十倍左右。

用scanline比较象素值只对RGB图有效,对索引图,最好先转成RGB图。
因为索引图,每一点存的是索引值,而不是实际象素值,所以没有办法进行比较。
 
算一下md5的值,然后比较一下,应该比较快吧
 
当做整数流比较!
 
我以前比较过,好象是有个函数做为字符比较!
 
用scanline方法比较,是下面这么写的吗?
for i := 0 to oldbmp.Width - 1 do
begin
row1 := oldbmp.ScanLine;
row2 := newbmp.ScanLine;
if (row1.rgbtBlue <> row2.rgbtBlue) or (row1.rgbtGreen <> row2.rgbtGreen) or (row1.rgbtRed <> row2.rgbtRed) then
begin
result := false;
exit;
end;
end;
 
不是,象以下这样:
如果图是8bit的。
var
row1, row2: PByteArray;
for i := 0 to oldbmp.Height - 1 do
begin
row1 := oldbmp.ScanLine;
row2 := newbmp.ScanLine;
for j := 0 to oldbmp.Width - 1 do
begin
if row1[j]<>row2[j] then
begin
result := false;
exit;
end;
end;
end;
 
谢谢楼上的兄弟们
 
后退
顶部