我的代码如下:
//面板Panel的Resize函数,Image放在此Panel上的,Image的大小随Panel改变而改变
procedure Tfrm_main.PanelResize(Sender: TObject);
var
  BackBitmap: TBitmap;
begin
  BackBitmap := TBitmap.Create;
  try
    BackBitmap.Assign(Image1.Picture.Bitmap); // 先将原来画的东西保存起来
    Image1.Picture.Graphic := nil; //清除原来的内容,否则没法改变大小。
    Image1.Width := Panel.Width;
    Image1.Height := Panel.Height;
    Image1.Canvas.Draw(0, 0, BackBitmap); // 再把原图画回去
  finally
    BackBitmap.Free;
  end;
end;但是当Panel的大小改变后,尤其是被缩小后,Image中已画的图形会被Panel的边框擦除掉,请问应该怎么解决这个问题?

解决方案 »

  1.   

    不明白你的意思是什么?
    你把Image.Stretch设置成为True试试呢?不用你的PanelResize事件!
      

  2.   

    把Image.Stretch设置成为True后,再在Image上面画图,比例就不对了。我的意思是当Image的大小被改变后,在它上面已经画过的图形会被擦除掉,比如Image原来的高度是100,我在它上面画了一条高为90的直线,现在把Image的大小变成了50,然后再变回100,那条直线就有一部分被Panel的边框给擦掉了。
      

  3.   

    procedure Tfrm_main.PanelResize(Sender: TObject);
    begin
      Image1.Width := Panel.Width;
      Image1.Height := Panel.Height;
    end;
    这样有什么问题吗?你需要怎么显示?
      

  4.   

    那么你用Canvas.CopyRect试试呢?
    Image1.Canvas.CopyRect(Rect(0, 0, Bitmap.Width, Bitmap.Height),
                           Bitmap.Canvas,
                           Rect(0, 0, Bitmap.Width, Bitmap.Height));
      

  5.   

    有问题啊,你们可以试下,把Panel 人为的拖小后,Image中的一些图象会被擦除掉的
      

  6.   

    这些图象都是我用Image2.Canvas.MoveTo 和 Image2.Canvas.LineTo画上去的。不是图片哈
      

  7.   

    就像MSN中的那个绘图效果一样
      

  8.   

    Image1.Stretch:=True;
    image1.Proportional:=True;    //关键是这句,属性窗里没有
    image1.Picture.LoadFromFile(Imagefn);
    妥了。
      

  9.   

    To zczb:
      你可能没有理解我的意思
      

  10.   

    不明白你的意思是什么?
    你把Image.Stretch设置成为True试试呢?不用你的PanelResize事件!把Image.Stretch设置成为True后,再在Image上面画图,比例就不对了。=========================================================================Image1.Stretch:=True;
    image1.Proportional:=True;    //关键是这句,属性窗里没有  ->“比例就对了”
    image1.Picture.LoadFromFile(Imagefn);
    妥了。难道我理解的不对吗?
    你就是想放一个Image在Panel上,然后随着Panel的大小而变Image的大小,而且要保持Image的比例,不对吗?
      

  11.   

    用 Bitmap 保存绘制的图形,并且该Bitmap应该有足够的高度与宽度,比如1024 x 768。
    绘制图形时,实际绘制到该Bitmap上。当需要显示时,将该Bitmap转换成一个与Image大小一样的Bitmap进行显示。转换时如果只是用Api Stretch绘制,如果是缩小,会有线条丢失,如果是放大会有矩齿。使用下面的函数进行转换可以失真较少procedure Stretch_Linear(bmpDest: TBitmap; bmpSrc: TBitmap);
    var
      sw: integer;
      sh: integer;
      dw: integer;
      dh: integer;
      B, N, x, y: integer;
      pLinePrev, pLineNext: PByte;
      pDest: PByte;
      pA, pB, pC, pD: PByte;
      nPixelSize: integer;
      i, j, k: integer;
      BxN, dwXdh, dhB, dwN: integer;
      dwXdh_dhB_dwN: integer;
    begin
        if (bmpDest.PixelFormat <> pf24bit)
            or (bmpSrc.PixelFormat <> pf24bit) then
          Exit;    sw := bmpSrc.Width - 1;
        sh := bmpSrc.Height - 1;
        dw := bmpDest.Width - 1;
        dh := bmpDest.Height - 1;    nPixelSize := 3;    for i := 0 to dh do
        begin        pDest := bmpDest.ScanLine[i];        y := i * sh div dh;        N := dh - i * sh mod dh;        pLinePrev := bmpSrc.ScanLine[y];
            Inc(y);
            if ( N = dh ) then
              pLineNext := pLinePrev
            else
              pLineNext := bmpSrc.ScanLine[y];        for j := 0 to dw do
            begin            x := j * sw div dw * nPixelSize;            B := dw - j * sw mod dw;            pA := pLinePrev;
                Inc(pA, x);            pB := pA;
                Inc(pB, nPixelSize);            pC := pLineNext;
                Inc(pC, x);            pD := pC;
                Inc(pD, nPixelSize);            if ( B = dw ) then
                begin
                    pB := pA;
                    pD := pC;
                end;
                BxN := B * N;
                dwXdh := dw * dh;
                dhB := dh * B;
                dwN := dw *N;
                dwXdh_dhB_dwN := dwXdh - dhB - dwN;
                for k := 0 to nPixelSize-1 do
                begin
                    pDest^ := ( BxN * ( pA^ - pB^ - pC^ + pD^ ) + dwN * pB^
                        + dhB * pC^ + ( dwXdh_dhB_dwN ) * pD^
                        + dwXdh shr 1 ) div ( dwXdh );
                    Inc(pA);
                    Inc(pB);
                    Inc(pC);
                    Inc(pD);
                    Inc(pDest);
                end;
            end
        end;
    end;注意: 输入输出的Bitmap必须是pf24bit格式
      

  12.   

    在Resize之前,想办法将原图片与画上去的图形合并成一张图,然后再缩放...