下面是本人写的,只做到一秒转25次,因为我的电脑差, 
跪求求更快速的方法~~~~~~~~
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, jpeg,
  Dialogs, StdCtrls, ExtCtrls, GDIPOBJ, GDIPAPI, GDIPUTIL, ActiveX;
const
  WmDrawPic = WM_USER + 100;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FCount:Integer;
    FSpeedText:string;
    FStream:TFileStream;
    procedure DrawPic(var   msg:TMSG);message WmDrawPic;   
  public
    { Public declarations }
  end;  TPicThread = class (TThread)
    private
      JpgStream:TMemoryStream;
    protected
      procedure Execute; override;
    public
      constructor Create(CreateSuspended: Boolean);reintroduce;
      destructor Destroy; override;
  end;var
  Form1: TForm1;
  aThread:TPicThread;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  if aThread = nil then
    aThread:=TPicThread.Create(False)
  else
  begin
    aThread.Terminate;
    aThread.WaitFor;
    aThread.Free;
    aThread:=nil;
  end;
end;procedure TForm1.DrawPic(var msg: TMSG);
begin
  with Canvas do
  begin
    Inc(FCount);
    TextOut(20,20,'          ');
    TextOut(20,20,FSpeedText);
  end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FStream.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  FStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'1.bmp',fmOpenRead);
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FSpeedText:=IntToStr(FCount);
  FCount:=0;
end;{ TPicThread }constructor TPicThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  JpgStream:=TMemoryStream.Create;
end;destructor TPicThread.Destroy;
begin
  JpgStream.Free;
  inherited;
end;//procedure TPicThread.Execute;       //这个只有8次/sec
//var
//  bmp:TBitmap;
//  jpg:TJPEGImage;
//begin
//  inherited;
//  bmp:=TBitmap.Create;
//  jpg:=TJPEGImage.Create;
//  try
//    while not Terminated do
//    begin
//      with Form1 do
//      begin
//        FStream.Position:=0;
//        bmp.LoadFromStream(FStream);
//        jpg.CompressionQuality:=50;
//        jpg.Compress;
//        jpg.Assign(bmp);
//        JpgStream.Clear;
//        jpg.SaveToStream(JpgStream);
//        SendMessage(Handle,WmDrawPic,0,0);
//      end;
//      Sleep(1);
//    end;
//  finally
//    jpg.Free;
//    bmp.Free;
//  end;
//end;procedure TPicThread.Execute;         // 用了gdi是快了很多 25次/sec
var
  gImgGUID: TGUID;
  gquality: ULONG;
  gParameters: TEncoderParameters;
  img:TGPImage;
  Stream,I:IStream;
begin
  inherited;
 GetEncoderClsid('image/jpeg', gImgGUID);
  gquality:=50;
  with gParameters do
  begin
    Count := 1;
    Parameter[0].Guid := EncoderQuality;
    Parameter[0].Type_ := EncoderParameterValueTypeLong;
    Parameter[0].NumberOfValues := 1;
    Parameter[0].Value := @gquality;
  end;
  Stream:=TStreamAdapter.Create(Form1.FStream);
  I:=TStreamAdapter.Create(JpgStream);
  img:=TGPImage.Create(Stream);
  try
    while not Terminated do
    begin
      with Form1 do
      begin
        FStream.Position:=0;
        JpgStream.Clear;
        img.Save(I,gImgGUID,@gParameters);
        SendMessage(Handle,WmDrawPic,0,0);
      end;
      Sleep(1);
    end;
  finally
    img.Free;
  end;
end;end.

解决方案 »

  1.   

    //        jpg.Assign(bmp);   修正
    //        jpg.CompressionQuality:=50;
    //        jpg.Compress;
      

  2.   

    GDI+转后的jpg,就变得不清晰了。
      

  3.   


    TGUID类似于索引,可以快速定位,所以从效率上已然提高很多
    单线程的效率基本也就是这样了。一分钟已经可以实现一千次,完全实现了批量
    思路就考虑多线程吧。
      

  4.   


    也是一种思路...但是CPU好像占用得太猛了,,
    好像也没有其他题解好的方法
      

  5.   


    恩,因为转化有大量的I/O操作,同时CPU又进行转化,所以占用肯定会大
    就你目前的情况,我觉得已经可以了