Как выложить изображение плиткой в TImage?
Как разбить изображение на плитки в TImage в Delphi?
Почему мне это нужно : вместо того, чтобы создавать больше Таймажей во время выполнения, я мог бы создать один и хранить там свое изображение, зная, что оно будет "соответствовать", пока не достигнет высоты и ширины Таймажа.
Пожалуйста, предложите любые идеи, чтобы сделать это.
Спасибо!
EDIT: Пожалуйста, обратите внимание, что я не прошу растягивать изображение, но заполняю холст, повторяя изображение.
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