如何在Delphi中使用CopyRect方法

如何在Delphi中使用CopyRect方法,delphi,Delphi,我正在从磁盘加载一个映像,并希望将其(部分)复制到第二个映像: Image1.Picture.LoadFromFile(S); with Image1.Picture.Bitmap do Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect); Image2只显示一个白色矩形,Image1不显示来自磁盘的文件。如果我删除第二条语句,Image1将显示该图像。(最奇怪的是:如果我只注释掉CopyRect语

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

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中
  • 图1消失(!),图2显示一个白色矩形

  • 顺便说一句,我使用的是Delphi 2009。

    TCanvas.CopyRect
    使用
    StretchBlt
    复制矩形。StretchBlt需要位图。如果要将任何其他图形类型加载到图像中,则其
    Picture.Bitmap
    为空。实际上,位图是在您引用它时创建的:
    使用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;
      ..
    

    我复制粘贴了你的代码,对我来说效果很好。尝试分离这两个语句(在两个按钮中),看看发生了什么:Image1.Picture.Bitmap强制图形类型保留“位图”。如果
    Image1.Picture
    还不是位图(虽然问题中缺少了位图,但看起来是这样),则图形将释放它并创建一个位图。@Magicmaster-谢谢,但似乎不起作用。我补充了我的问题。这就是为什么@Magic的代码起作用,他正在加载一个“位图”。@stevenvh:文件名是什么?特别是,文件扩展名是什么?它是‘bmp’、‘png’、‘jpg’、?谢谢,这就解决了。现在我只需要把颜色弄对:-(