比较Bmp,JPEG,PNG,TIF文件

时间:2017-05-30 20:34:10

标签: delphi bitmap compare jpeg filestream

我需要一个将两个文件的内容进行比较的方法,文件可以是BMP,JPEG,PNG,TIF 我试过这个

procedure TForm1.Button1Click(Sender: TObject);
var
 f1, f2 : TFileStream;
 Bytes1: TBytes;
 Bytes2: TBytes;
 i: integer;
 s: booleAN;
begin
 f1 := TFileStream.Create('C:\Output\Layout 1.JPG' , fmOpenRead);
 f2 := TFileStream.Create('C:\Data\Layout 1.JPG' , fmOpenRead );

 if f1.Size <> f2.Size then
 begin
   ShowMessage('size');
   exit;
 end;

 SetLength(Bytes1, f1.Size);
 f1.Read(Bytes1[0], f1.Size);

 SetLength(Bytes2, f2.Size);
 f2.Read(Bytes2[0], f2.Size);

 s:= true;
 for I := 1 to length(Bytes1) do
 begin
   if Bytes1[i] <> Bytes2[i] then
   begin
     s := false;
     Exit;
   end;
 end;

 if s then
   ShowMessage('same');
end;

但这对我来说效果不错我的文件内容相同,但它们的大小在2字节不同。

其中一个文件是我必须提供给用户的另一个文件是用户打开同一个文件并复制它的文件,所以为什么它们是2字节不同我不知道但是他们应该远离比较这些文件的内容

2 个答案:

答案 0 :(得分:0)

代码有一个错误。动态数组基于零,因此循环应为:

for I := 0 to high(Bytes1) do

代码效率很低。它不应该立即读取所有内容。您应该使用CompareMem来比较内存块。

你说文件的大小不同,但你希望它们相等。嗯,这没有任何意义。您的代码会明确检查大小是否匹配。

打开和读取JPEG文件将修改内容,因为JPEG是一种有损压缩算法。

您的主题建议您希望比较PowerPoint文件,但文件实际上是JPEG图像。

答案 1 :(得分:-1)

如果你要比较JPEG,你可能需要包括一个范围,比如

Const 
   DELTA = 2 ;

if (Bytes1[i] - Bytes2[i] > DELTA) OR (Bytes1[i] - Bytes2[i] < -DELTA) then