function resizeBmp(oriBmp:TBitMap;w,h:Integer):TBitMap;
var
  tmpBmp:TBitMap;
begin
      tmpBmp:=TBitmap.Create;
      tmpBmp.Width:=w;
      tmpBmp.Height:=h;
      tmpbmp.Canvas.StretchDraw(Rect(0, 0, w,h),oriBmp);
      result:=tmpBmp;
      //tmpBmp.free;
end;以下函数,是调整一个BMP文件的长宽,然后返回一个新的bmp。但里面有一个问题,tmpBmp如果不执行free,就造成内存不释放,如果free的话,取函数返回的结果时,就出错了。有人讲,把它写成
procedure resizeBmp(var oriBmp:TBitMap;w,h:Integer):TBitMap; 只传oriBmp的地址进来,但是,如果我传进来的是Form1.image1.bitMap,这样就把image1的图象改变了。当然,我可以实例化一个BitMap对象,然后传进来,然而,这不是简洁的办法。请教一下各位,有没有更好的方案?谢谢。

解决方案 »

  1.   

    你应该把调用的代码也贴出来给我们分析A, B: TBitmap;A := TBitmap.Create;
    B := A;并不表示B又开辟了新的内存实例
    A、B都是指针,内存实例是通过TBitmap.Create得到的
    B := A;只是将B的指针同A一样指向TBitmap.Create开辟的内存实例
    B.Free; 其实就等于A.Free; 它们操作的是同一内存实例Image1.Picture.Bitmap作为实参或形参都是一样会改变图像
    Image1.Picture.Bitmap只是一个指针,你函数里控制的是内存实例
      

  2.   

    var
      tmpBmp:TBitMap;
      tmpBmp:=TBitmap.Create;
    function resizeBmp(oriBmp,tmpBmp:TBitMap;w,h:Integer):TBitMap;
    begin
                tmpBmp.Width:=w;
          tmpBmp.Height:=h;
          tmpbmp.Canvas.StretchDraw(Rect(0, 0, w,h),oriBmp);
          result:=tmpBmp;
         
    end;
     tmpBmp.free;