Как разместить изображение в TImage?

Как разместить изображение в TImage в Delphi?

Зачем мне это нужно: вместо того, чтобы создавать больше TImage во время выполнения, я мог бы создать один и хранить там свое изображение, зная, что оно будет «подходящим», пока не достигнет высоты и ширины TImage.

Пожалуйста, предложите любые идеи, чтобы сделать это.

Спасибо!

РЕДАКТИРОВАТЬ: обратите внимание, я не прошу растягивать изображение, а заполняю холст, повторяя изображение.


person Ivan Prodanov    schedule 12.08.2009    source источник
comment
Джон: пожалуйста, используйте delphi-2009, а не delphi2009 - кажется, что - соглашение гораздо более популярно в SO.   -  person smok1    schedule 13.08.2009


Ответы (5)


Ниже приведена функция, которую я использовал, беря существующий компонент TImage и размещая его на целевом холсте:

procedure TileImage(const Source:tImage;
    Target: TCanvas;
    TargetHeight,TargetWidth:integer);
// Tiles the source image over the given target canvas
var
  X, Y: Integer;
  dX, dY: Integer;
begin
  dX := Source.Width;
  dY := Source.Height;
  Y := 0;
  while Y < TargetHeight do
    begin
      X := 0;
      while X < TargetWidth do
        begin
          Target.Draw(X, Y, Source.Picture.graphic);
          Inc(X, dX);
        end;
      Inc(Y, dY);
    end;
end;

Поскольку tLabel предоставляет холст, вы можете делать такие трюки, как следующие:

TileImage(Image1,Label1.Canvas,Label1.Height,Label1.Width);
person skamradt    schedule 12.08.2009

Предполагая, что ваше изображение является растровым изображением и загружено в TImage, вы можете использовать следующее

procedure TmyForm.Button1Click(Sender: TObject);
    var mybmp:TBitmap;
begin
    mybmp:= TBitmap.Create();
    try
        mybmp.Assign(Image1.Picture.Bitmap);

        Image1.Picture.Bitmap.SetSize(Image1.Width,Image1.Height);
        Image1.Canvas.Brush.Bitmap := mybmp;
        Image1.Canvas.FillRect(Image1.BoundsRect);

        mybmp.FreeImage;
    finally
        FreeandNil(mybmp)
    end;
end;

Некоторые примечания:

Если вы сохраните изображение после того, как озаглавите его, вы сохраните озаглавленную версию, а не оригинал.

Image1.Canvas и Image1.Picture.Bitmap.Canvas — это одно и то же, поэтому перед рисованием на холсте необходимо изменить размер растрового изображения.

Если вы попытаетесь назначить растровое изображение в TImage кисти, не назначив его сначала другому объекту растрового изображения, например, Image1.Canvas.Brush.Bitmap := Image1.Picture.Bitmap, вы получите исключение «не достаточно места для хранения".

person Re0sless    schedule 13.08.2009
comment
Это намного проще, чем большинство решений, многократно вызывающих Draw внутри дважды вложенного цикла for. Кроме того, этот код не выходит за рамки заданного прямоугольника. Недурно! - person PatrickvL; 03.06.2010

Вы можете установить canvas.brush.bitmap := на изображение плитки. затем canvas.fillrect(canvas.cliprect), чтобы замостить весь холст выбранным мозаичным изображением. Я не делал этого в течение длительного времени, и я не могу проверить, действительно ли это делается в Delphi прямо сейчас, но я почти уверен, что это то, что вам нужно.

person Peter Perháč    schedule 12.08.2009

Установка Delphi поставляется с демонстрацией под названием «Bitmap» (вы можете найти проект в каталоге справки).

Он использует следующий метод для рисования мозаичного изображения:

procedure TBmpForm.FormPaint(Sender: TObject);
var
  x, y: Integer;
begin
  y := 0;
  while y < Height do
  begin
    x := 0;
    while x < Width do
    begin
      // Bitmap is a TBitmap.
      //  form's OnCreate looks like this:
      //    Bitmap := TBitmap.Create;
      //    Bitmap.LoadFromFile('bor6.bmp');
      //  or you can use Canvas.Draw(x, y, Image1.Picture.Bitmap),
      //  instead of Canvas.Draw(x, y, Bitmap);
      //
      Canvas.Draw(x, y, Bitmap); //Bitmap is a TBitmap. 
      x := x + Bitmap.Width; // Image1.Picture.Bitmap.Width;
    end;
    y := y + Bitmap.Height; // Image1.Picture.Bitmap.Height;
  end;
end;

Надеюсь, это поможет!

person Olaf    schedule 12.08.2009

Под "подгонкой" ты имеешь в виду "укладка плитки"? Насколько я знаю, TImage не поддерживает это из коробки. Вам придется вручную нарисовать изображение на холсте TImage в повторяющемся шаблоне.

person Dmitry Brant    schedule 12.08.2009