如何在德尔菲的TImage中平铺图像?
我需要它的原因:不需要在运行时创建更多的TImages,我可以创建一个,并将我的图像存储在那里,知道它将‘适合’,直到它达到TImage的高度和宽度。
请提出任何想法来做这个。
谢谢!
编辑:请注意,我不是要求散布图像,而是通过重复图像填充画布。
发布于 2009-08-12 22:03:25
下面是我所使用的函数,使用现有的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);发布于 2009-08-13 09:11:09
假设您的图像是位图并加载到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;一些注释:
如果你保存图片后,它的标题,你将保存标题版本,而不是原来。
canvas和Image1.Picture.Bitmap.Canvas是相同的,这就是为什么在画布上绘制之前需要调整位图的大小。
如果尝试将TImage中的位图分配给画笔,而不首先将其分配给另一个位图对象,比如Image1.Canvas.Brush.Bitmap := Image1.Picture.Bitmap,则会得到“存储不足”的异常。
发布于 2009-08-12 20:29:18
您可以将canvas.brush.bitmap :=设置为瓷砖的图像。然后canvas.fillrect(canvas.cliprect)用选定的瓷砖图像平铺整个画布。我已经很久没有这样做了,我无法确定这是否真的是现在在Delphi中所做的,但我很确定这就是你想要的。
https://stackoverflow.com/questions/1268410
复制相似问题