最近做图片处理时遇到一难题! 将单张图片顶部加入文字,代码已经实现,可问题出来!运行一段时间后,内存就一直涨,直到出现"Out of system resources"错误图片为:3744 * 1440 大小:377KB (Delphi 7.0 写的代码)该如何处理这图片如不让内存涨?还有处理速度?(有更好的算法!!!高手出手啊。)
function DrawToPicText(strFarImg, strFont, strSave,
sFlip, sImageNum: string): Boolean;
var
jp1: TJPEGImage;
bmp_t,bmp: TBitmap;
begin
jp1 := nil; bmp_t := nil; bmp := nil;
jp1 := TJPEGImage.Create;
bmp := TBitmap.Create;
bmp_t := TBitmap.Create;try
jp1.LoadFromFile(strFarImg);
try
bmp.Canvas.Lock;
bmp.PixelFormat := pf24bit;
bmp_t.Assign(jp1); // 照片一bmp.Width := bmp_t.Width;
bmp.Height := bmp_t.Height + 32;
bmp.Transparent := True;
bmp.Canvas.Font.Color :=clRed;
bmp.Canvas.Font.Size := 18;
bmp.Canvas.Font.Name := 'System';
bmp.Canvas.Draw(0, 32, bmp_t);
bmp.Canvas.TextOut(0,0,strFont);
jp1.Assign(bmp);
// sleep(200);
if not fileexists(strsave) then jp1.SaveToFile(strSave);
bmp.Canvas.Unlock;
freeandnil(bmp);
freeandnil(bmp_t);
except
on E:Exception Do
FrmMain.ErrLog('处理出错: <DrawToPicTextAndSave> '+ e.Message);
end;
finally
//jp1.Free;
end;
freeandnil(jp1);
Result := True;
end;
function DrawToPicText(strFarImg, strFont, strSave,
sFlip, sImageNum: string): Boolean;
var
jp1: TJPEGImage;
bmp_t,bmp: TBitmap;
begin
jp1 := nil; bmp_t := nil; bmp := nil;
jp1 := TJPEGImage.Create;
bmp := TBitmap.Create;
bmp_t := TBitmap.Create;try
jp1.LoadFromFile(strFarImg);
try
bmp.Canvas.Lock;
bmp.PixelFormat := pf24bit;
bmp_t.Assign(jp1); // 照片一bmp.Width := bmp_t.Width;
bmp.Height := bmp_t.Height + 32;
bmp.Transparent := True;
bmp.Canvas.Font.Color :=clRed;
bmp.Canvas.Font.Size := 18;
bmp.Canvas.Font.Name := 'System';
bmp.Canvas.Draw(0, 32, bmp_t);
bmp.Canvas.TextOut(0,0,strFont);
jp1.Assign(bmp);
// sleep(200);
if not fileexists(strsave) then jp1.SaveToFile(strSave);
bmp.Canvas.Unlock;
freeandnil(bmp);
freeandnil(bmp_t);
except
on E:Exception Do
FrmMain.ErrLog('处理出错: <DrawToPicTextAndSave> '+ e.Message);
end;
finally
//jp1.Free;
end;
freeandnil(jp1);
Result := True;
end;
解决方案 »
- 最简单SQL问题
- 求中国式财务金额显示的DBGRID类的控件!分不够可以加!
- 两行文本用什么符号连起来?真急人
- 请教关于鼠标消息相应顺序的问题!
- 关于assignfile()的用法
- 制件GlassPanel.效果跟SpeedButton的一样。
- 动态创建的含有较多内容的控件,在不需要其的后续步骤中,是将其释放好,还是不释放好?
- ★★★delphi中的sql语句执行问题
- 各位插入记录是直接用SQL命令,还是用控件里的命令如insertrecord?
- 有沒有自动补齐字符串的函数或过程,如有‘21,但要求是10位,自动的加8个‘0’,‘211’的话,就补7个‘0’,
- 关于form2.窗口在form1中显示的方法...求助大大 ...
- webbrowser1的执行顺序问题
建议用一个bmp引用,放到过程外部
最好是用全局实例,程序中只有一个bmp实例,不要随意TBitmap.Create
var
Form1: TForm1;
jp1: TJPEGImage;
bmp_t,bmp: TBitmap; implementation{$R *.dfm}
procedure TForm1.create();
begin
jp1 := TJPEGImage.Create;
bmp := TBitmap.Create;
bmp_t := TBitmap.Create;
end;function DrawToPicText(jp1:TJPEGImage;bmp_t,bmp: TBitmap;strFarImg, strFont, strSave,
sFlip, sImageNum: string): Boolean;
begin
try
jp1.LoadFromFile(strFarImg);
try
bmp.Canvas.Lock;
bmp.PixelFormat := pf24bit;
bmp_t.Assign(jp1); // 照片一 bmp.Width := bmp_t.Width;
bmp.Height := bmp_t.Height + 32;
bmp.Transparent := True;
bmp.Canvas.Font.Color :=clRed;
bmp.Canvas.Font.Size := 18;
bmp.Canvas.Font.Name := 'System';
bmp.Canvas.Draw(0, 32, bmp_t);
bmp.Canvas.TextOut(0,0,strFont);
jp1.Assign(bmp);
// sleep(200);
if not fileexists(strsave) then jp1.SaveToFile(strSave);
bmp.Canvas.Unlock; except
on E:Exception Do
FrmMain.ErrLog('处理出错: <DrawToPicTextAndSave> '+ e.Message);
end;
finally
//jp1.Free;
end; Result := True;
end;
你再找找,可能还有其它资源没有释放掉