最近做图片处理时遇到一难题! 将单张图片顶部加入文字,代码已经实现,可问题出来!运行一段时间后,内存就一直涨,直到出现"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;

解决方案 »

  1.   

    你是不是频繁调用此过程了,而导致过程内bmp的频繁创建,没有销毁导致
    建议用一个bmp引用,放到过程外部
      

  2.   

    to bdmh  能详细说说么? 此过程是平繁的调用,定义在线程序,有图片后,就会平繁的调用的。对于销毁 代码中都快慢 free过了呀
      

  3.   

    在你这个过程里不要频繁调用BMP的创建,你一直频繁调用这个过程的话就会造成频繁创建,也就导致错误
      

  4.   

    手动把TBitmap.Create创建的实例释放
    最好是用全局实例,程序中只有一个bmp实例,不要随意TBitmap.Create
      

  5.   

    是否把调用的BMP放到外部创建好? 然后引用! 用完在free? 楼上的是能举个例?
      

  6.   

    应该是这个意思吧,先建立三个全局变量,在窗体创建的时候建立他们,然后再传进去,程序关闭的时候再释放他们
    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;
      

  7.   

    自己顶一下~  此种方法,如果长时间运行,同样还是出现 Out of system resources 但发现,在出现这错误之前,报:“句柄无效!”
      

  8.   

    这是GDI的问题,你一直没有释放资源的话,就会报这些错,而且报的错误还五花八门,我也曾经碰到过这个问题,就是因为不停的调用一个创建HRGN的过程,又没释放(是以前别的同事写的),结果就容易出错。
    你再找找,可能还有其它资源没有释放掉
      

  9.   

    那就不在图片上打字啊,另外搞个LABEL控件,设置透明就可以了
      

  10.   

    结贴  自己搞定!VC 写个dll 调用一切的一切搞定. 个人总结一下:delphi 在GDI 操作时对内存的管理还是不行(D7.0) 不知后升级版本如何.