Как использовать метод CopyRect в 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 показывает белый прямоугольник.

кстати, я использую Delphi 2009.

1 ответов


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;
  ..