在Delphi中对图像进行校验和 [英] Checksum an image in Delphi

查看:77
本文介绍了在Delphi中对图像进行校验和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对图像进行校验和,但是给出结果花费了太长时间,尝试了添加值,以及Adler-32,但是两者都需要很长时间(大约2秒)完成.

I am trying to checksum an image, but it takes too long to give a result, tried add values, and Adler-32 but both finishes in a long time (approximately 2 seconds).

添加值:

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;

Adler-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;

如您所见,我正在努力避免某些价值观(技术原因).也许这使它花费了太长时间,我不知道,有什么想法可以改进此算法?

As you see, i am trying to avoid some values (technical reasons). Maybe this what makes it takes too long, i don't know, any ideas for improving this algorithm ?

推荐答案

我已经进行了一些更正,以使您的代码的第一个版本更快:

I have done some correction to make the first version of your code fast:

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;


已更新:由于我修复了代码(高度1),(宽度1)中的错误,因此产生了不同的结果.我还更改了循环顺序(按高度的外部循环)-必须使用ScanLine.比较之前,您必须在代码中进行相同的更正.


Updated: It gives different result because I fixed a bug in your code (Height-1), (Width-1). I also changed the loop order (external loop by Height) - it is nessessary to use ScanLine. You must do the same corrections in your code before comparing.

这篇关于在Delphi中对图像进行校验和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆