Как использовать метод CopyRect в Delphi - PullRequest
6 голосов
/ 02 декабря 2011

Я загружаю изображение с диска и хочу скопировать (частично) его во второй TImage:

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

Изображение 2 просто показывает белый прямоугольник, а изображение 1 не показывает файл издиск.Если я удаляю второе утверждение, Image1 показывает изображение.(Самое странное: если я только закомментирую оператор CopyRect и оставлю строку «с» (пустой оператор), Image1 тоже не будет отображаться!)

Как использовать CopyRect для копирования части изображения?

edit
Когда я разделяю два оператора на два отдельных действия (кнопки), происходит следующее:

  1. Изображение загружается и отображается в Image1
  2. Изображение 1 исчезает (!), А изображение 2 показывает белый прямоугольник.

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

1 Ответ

6 голосов
/ 02 декабря 2011

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;
  ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...