Ещё немного об оптимизации и хороших манерах... Чтобы слишком сильно не занудствовать, я немного обработал ваш код напильником для примера...
| Код | unit Unit7;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm7 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private rc, gc, bc: array of Byte; procedure SomeCounts; procedure RandomDraw; public { Public declarations } end;
// Эти два типа взяты из статьи TRGBS = packed record Red, Green, Blue, System: Byte; end;
TRgbsColor = record case Boolean of True : (Color: TColor); False: (RGBS : TRGBS ); end;
var Form7: TForm7;
implementation
{$R *.dfm}
procedure TForm7.Button1Click(Sender: TObject); begin SomeCounts; end;
procedure TForm7.Button2Click(Sender: TObject); begin RandomDraw; end;
procedure TForm7.SomeCounts; var len: integer; startx, stopx, starty, stopy: Integer; i,j, k: Integer; s, s2, s3: int64; Rav, Gav, Bav: Integer; RgbsColor: TRgbsColor; begin startx:=1; stopx:= 20; starty:=1; stopy:= Image1.Height-30;
len:= (stopx-startx+1) * (stopy-starty+1); SetLength(rc, len); SetLength(gc, len); SetLength(bc, len);
k:= 0; for i := 0 to (stopx-startx) do for j := 0 to (stopy-starty) do begin RgbsColor.Color := GetPixel(Image1.Canvas.Handle, i, j); rc[k]:= RgbsColor.RGBS.Red; bc[k]:= RgbsColor.RGBS.Blue; gc[k]:= RgbsColor.RGBS.Green; k:= k+1; end;
try s:= 0; s2:= 0; s3:= 0; for i := Low(rc) to High(rc) do s:= s+ rc[i]; Rav:= Round(s/Length(rc)); for i := Low(gc) to High(gc) do s2:= s2+ gc[i]; Gav:= Round(s2/Length(gc)); for i := Low(bc) to High(bc) do s3:= s3+ bc[i]; Bav:= Round(s3/Length(bc)); except
end;
ShowMessage(IntToStr(Rav)+ ' '+ IntToStr(Gav)+' '+IntToStr(Bav)); end;
procedure TForm7.RandomDraw; begin Image1.Canvas.Brush.Color:= RGB(Random(254), Random(254), Random(254)); Image1.Canvas.Rectangle(0, 0, Round(Image1.Width), Round(Image1.Height/2)); Image1.Canvas.Brush.Color:= RGB(Random(254), Random(254), Random(254)); Image1.Canvas.Rectangle(0, Round(Image1.Height/2), Image1.Width, Image1.Height); end;
end.
|
|