3

如何TImage在 Delphi 中平铺图像?

为什么需要它:与其在运行时创建更多的 TImage,我可以创建一个并将我的图像存储在那里,知道它会“适合”直到它达到 TImage 的高度和宽度。

请提出任何想法来做到这一点。

谢谢!

编辑:请注意,我不是要求拉伸图像,而是通过重复图像来填充画布。

4

5 回答 5

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);
于 2009-08-12T22:03:25.323 回答
6

假设您的图像是位图并加载到 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您会得到一个异常“存储空间不足”。

于 2009-08-13T09:11:09.887 回答
5

您可以将 设置canvas.brush.bitmap :=为瓷砖的图像。然后canvas.fillrect(canvas.cliprect)用选定的平铺图像平铺整个画布。我已经很久没有这样做了,我无法检查这是否真的是现在在 Delphi 中的做法,但我很确定这就是你所追求的。

于 2009-08-12T20:29:18.947 回答
3

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;

希望有帮助!

于 2009-08-12T21:41:44.557 回答
0

“装修”是指“平铺”吗?据我所知,TImage 不支持这个开箱即用。您必须以重复的模式在 TImage 的画布上手动绘制您的图片。

于 2009-08-12T20:08:26.727 回答