我正在尝试校验一个图像,但是给出一个结果,尝试添加值和Adler-32需要很长时间,但两者都会在很长一段时间内完成(大约2秒).
添加值:
Function Checksum_CountryFlag(Img : TPicture):Integer;
var j, k, Checksum : Integer;
begin
Checksum := 0;
For j := 0 to Img.Width do
For k := 0 to Img.Height do
If (((Img.Bitmap.Canvas.Pixels[j,k]) <> 15577344) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 15311104) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 3816255) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 10526623) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 12303034) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 9013641)) Then
begin
Checksum := Checksum + Img.Bitmap.Canvas.Pixels[j,k];
end;
Result := Abs(Checksum);
end;
Run Code Online (Sandbox Code Playgroud)
阿德勒-32:
Function Checksum_Adler32(Img : TPicture):Integer;
var i,a,b,j,k : Integer;
begin
a := 1; b := 0;
For j := 0 to Img.Width do
For k := 0 to Img.Height do
If (((Img.Bitmap.Canvas.Pixels[j,k]) <> 15577344) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 15311104) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 3816255) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 10526623) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 12303034) And ((Img.Bitmap.Canvas.Pixels[j,k]) <> 9013641)) Then
begin
a := a + Img.Bitmap.Canvas.Pixels[j,k];
b := b + a;
end;
Result := Abs(a) + Abs(b);
end;
Run Code Online (Sandbox Code Playgroud)
如你所见,我试图避免一些价值观(技术原因).也许这就是为什么需要太长时间,我不知道,有什么改进这个算法的想法?
我做了一些修正,以快速制作代码的第一个版本:
Function Checksum_CountryFlag(Img : TPicture):Integer;
var j, k, Checksum : Integer;
Line: PLongInt;
begin
Checksum := 0;
Img.Bitmap.PixelFormat:= pf32bit; // just for case
For k := 0 to Img.Height - 1 do begin // !! Height first, -1
Line:= Img.Bitmap.ScanLine[k];
For j := 0 to Img.Width - 1 do begin // !! -1
If ((Line^ <> 15577344) And (Line^ <> 15311104) And (Line^ <> 3816255)
And (Line^ <> 10526623) And (Line^ <> 12303034) And (Line^ <> 9013641)) Then
begin
Checksum := Checksum + Line^;
end;
Inc(Line);
end;
end;
Result := Abs(Checksum);
end;
Run Code Online (Sandbox Code Playgroud)
更新:它给出了不同的结果,因为我修复了代码中的错误(Height-1),(Width-1).我也改变了循环顺序(外部循环的高度) - 使用ScanLine是必要的.在比较之前,您必须在代码中执行相同的更正.