如何在Delphi中使用CopyRect方法

时间:2011-12-02 17:41:48

标签: delphi

我正在从磁盘加载图像并希望将其复制(部分)到第二个TImage:

Image1.Picture.LoadFromFile(S);
with Image1.Picture.Bitmap do
  Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);

Image2只显示一个白色矩形,而Image1不显示磁盘上的文件。如果我删除第二个语句Image1确实显示图像。 (最奇怪的是:如果我只注释掉CopyRect语句并留下“with”行(空语句)Image1也不显示!)

如何使用CopyRect复制部分图像?

修改
当我将两个语句拆分为两个单独的操作(按钮)时,会发生以下情况:

  1. 图片加载并显示在Image1
  2. Image1消失(!),Image2显示白色矩形。
  3. BTW,我正在使用Delphi 2009。

1 个答案:

答案 0 :(得分:6)

TCanvas.CopyRect使用StretchBlt复制矩形。 StretchBlt需要一个位图。如果您要为图片加载任何其他图形类型,则其Picture.Bitmap为空。实际上,只有在您引用位图时才会创建位图:with Image1.Picture.Bitmap do

您可以使用临时位图作为原因:

var
  Bmp: TBitmap;
begin
  Image1.Picture.LoadFromFile(S);

  Bmp := TBitmap.Create;
  try
    Bmp.Assign(Image1.Picture.Graphic);

    with Bmp do
      Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
  finally
    Bmp.Free;
  ..