вот получилось
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, math, ExtCtrls;
type TForm1 = class(TForm) btn1: TButton; tmr1: TTimer; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure tmr1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
{$O-}
type TColorArray = packed array[0..High(integer) div 4 - 1] of integer; PColorArray = ^TColorArray;
var b : TBitmap; l : integer; h, w: integer; size: Integer; map : array of PColorArray; mem : Pointer;
procedure TForm1.FormDestroy(Sender: TObject); begin FreeMem(mem, size); b.Free; end;
procedure TForm1.FormCreate(Sender: TObject); var FH : TBitmapFileHeader; IH : TBitmapInfoHeader; f : TFileStream; i : integer;
begin b := TBitmap.Create; b.PixelFormat := pf24bit;
f := TFileStream.Create('f:/1.bmp', fmOpenRead); f.ReadBuffer(FH, sizeof(FH)); f.ReadBuffer(IH, sizeof(IH));
w := IH.biWidth; h := IH.biHeight;
b.Width := 250; b.Height := h;
l := ((w * 3 + 3) div 4) * 4; size := l * h; GetMem(mem, size); f.Position := FH.bfOffBits; f.ReadBuffer(mem^, size);
SetLength(map, IH.biHeight); map[0] := mem; for i := 1 to h - 1 do map[i] := Pointer(Integer(map[i-1]) + l);
f.Free; end;
Procedure CopyRect(r : TRect; cv : TCanvas); var i, j : Integer; start, count : Integer; sline, fline : Integer; Begin start := max(0, r.Left * 3); count := max(r.Right * 3 - start, 0); sline := max(r.Top, 0); fline := min(r.Bottom, h - 1); for i := sline to fline do Move(pointer(integer(map[i]) + start)^, b.ScanLine[i]^, count);
Cv.Draw(20, 20, b); end;
var st : integer = 0;
procedure TForm1.tmr1Timer(Sender: TObject); begin CopyRect(rect(st, 0, st + 249, 99), Canvas); st := st + 249; end;
end.
|
|