Как выложить изображение плиткой в TImage?



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



Почему мне это нужно : вместо того, чтобы создавать больше Таймажей во время выполнения, я мог бы создать один и хранить там свое изображение, зная, что оно будет "соответствовать", пока не достигнет высоты и ширины Таймажа.



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



Спасибо!



EDIT: Пожалуйста, обратите внимание, что я не прошу растягивать изображение, но заполняю холст, повторяя изображение.

554   5  

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;

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

TileImage(Image1,Label1.Canvas,Label1.Height,Label1.Width);

Предполагая, что ваше изображение является растровым и загружено в 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.Холст и Образ1.Изображение.Растровый.Холст-это одно и то же, поэтому вам нужно изменить размер растрового изображения, прежде чем рисовать на холсте.

Если вы попытаетесь назначить растровое изображение в Таймаже кисти, не назначая его другому растровому изображению объект сначала так Image1.Холст.Щетка.Растровое Изображение: = Image1.Изображение.Bitmap Вы получаете исключение "недостаточно памяти".

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

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

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

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;

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

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

Comments

    Ничего не найдено.