下面是本人写的,只做到一秒转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.
跪求求更快速的方法~~~~~~~~
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.
// jpg.CompressionQuality:=50;
// jpg.Compress;
TGUID类似于索引,可以快速定位,所以从效率上已然提高很多
单线程的效率基本也就是这样了。一分钟已经可以实现一千次,完全实现了批量
思路就考虑多线程吧。
也是一种思路...但是CPU好像占用得太猛了,,
好像也没有其他题解好的方法
恩,因为转化有大量的I/O操作,同时CPU又进行转化,所以占用肯定会大
就你目前的情况,我觉得已经可以了