您的位置:首页 > 其它

多线程处理图片,bmp不支持,png支持

2015-09-14 18:52 525 查看
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls, pngimage, PngImageProcessor, Math, IGDIPlus,
  JaContainers;

type

  TMyCalThread = class(TThread)
  public
    IsWorking: Boolean;
    FDestBmp: TPNGObject;
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Timer1: TTimer;
    Button1: TButton;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  public
    FCalThread: TMyCalThread;
  end;

var
  Form1: TForm1;
  GSyn: TSyncObject;

implementation

{$R *.dfm}

{ TMyCalThread }

procedure TMyCalThread.Execute;
var
  LSrcBmp: TPNGObject;
  LTmpBmp: TPNGObject;
begin
  inherited;

  LSrcBmp := TPNGObject.Create;
  LTmpBmp := TPNGObject.Create;
  FDestBmp := TPNGObject.Create;
  LSrcBmp.LoadFromFile('3.png');

  // ! 此方法对bmp无效,因为bmp调用了窗口的东西,除非自己实现bmp的文件处理
  while not Terminated do
  begin
    if IsWorking then
    begin
      SetPngImageSize(Random(300) + 200, Random(150) + 50, LTmpBmp);

      DoRoomPng(LSrcBmp, LTmpBmp);
      
      GSyn.Lock;
      try
        FDestBmp.Assign(LTmpBmp);
      finally
        GSyn.Unlock;
      end;

      IsWorking := False;
    end;
    
    Sleep(10);
  end;

end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GSyn := TSyncObject.Create;
  GSyn.ThreadSafe := True;

  FCalThread := TMyCalThread.Create(True);
  FCalThread.FreeOnTerminate := True;
  FCalThread.IsWorking := False;
  FCalThread.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //FreeAndNil(GSyn);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if FCalThread.FDestBmp <> nil then
  begin
    GSyn.Lock;
    try
      Canvas.Draw(100, 100, FCalThread.FDestBmp);
    finally
      GSyn.Unlock;
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not FCalThread.IsWorking then
  begin
    FCalThread.IsWorking := True;

    Invalidate;
  end;
end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: