如何在Delphi的TImage
中平铺图像?
为什么我需要它:我可以在运行时创建一个并存储我的图像,而不是在运行时创建更多TImages,因为它知道它将“适合”,直到达到TImage的高度和宽度。
请提出任何建议。
谢谢!
编辑:请注意,我不是要求拉伸图像,而是通过重复图像来填充画布。
答案 0 :(得分:6)
以下是我使用的函数,将现有的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);
答案 1 :(得分:5)
假设您的图像是位图并加载到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 例外“存储空间不足”。
答案 2 :(得分:4)
您可以将canvas.brush.bitmap :=
设置为图块的图像。然后canvas.fillrect(canvas.cliprect)
使用选定的图块图像平铺整个画布。我没有在很长一段时间内完成它,我现在无法检查这是否真的在Delphi中完成,但我很确定这就是你所追求的。
答案 3 :(得分:3)
Delphi安装附带一个名为“Bitmap”的Demo(您可以在Help 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;
希望有所帮助!
答案 4 :(得分:0)
通过“拟合”你的意思是“平铺”? 据我所知,TImage不支持开箱即用。您必须以重复模式在TImage的画布上手动绘制图片。