Frage

Wie kann ich Kachel ein Bild in einem TImage in Delphi?

Warum ich es brauche . Statt mehr timages zur Laufzeit zu schaffen, ich erstellen konnte und mein Bild speichere es zu wissen, dass es ‚fit‘ sein wird, bis er TImage Höhe und Breite erreicht

Bitte legen nahe, irgendwelche Ideen, dies zu tun.

Danke!

EDIT:. Bitte beachten Sie, ich bitte nicht das Bild für Streching, aber die Leinwand füllen, indem das Bild zu wiederholen

War es hilfreich?

Lösung

Im Folgenden wird die Funktion, die ich verwendet habe, eine bestehende TImage Komponente zu nehmen und es über eine Ziel Leinwand Fliesen:

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;

Da ein TLabel eine Leinwand macht, können Sie Tricks wie folgt tun:

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

Andere Tipps

Ihr Bild Unter der Annahme, ein Bitmap geladen und in die TImage können Sie die folgende

verwenden
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;

Einige Anmerkungen:

Wenn Sie das Bild speichern, nachdem es Betitelung Sie den Titel Version nicht das Original speichern.

Image1.Canvas und Image1.Picture.Bitmap.Canvas sind ein und dasselbe, das ist, warum Sie die Bitmap, um die Größe benötigen, bevor sie auf der Leinwand zu malen.

Wenn Sie die Bitmap in der TImage auf die Bürste versuchen und zuweisen, ohne sie zu einem anderen Bitmap-Objekt zuweisen zunächst wie so Image1.Canvas.Brush.Bitmap: = Image1.Picture.Bitmap Sie erhalten eine Ausnahme "nicht genügend Speicher".

Sie können die canvas.brush.bitmap := auf das Bild der Fliese. dann canvas.fillrect(canvas.cliprect) die ganze Leinwand mit dem ausgewählten Kachelbild zu Fliese. Ich habe es nicht in einer langen Zeit getan, und ich bin nicht in der Lage zu überprüfen, ob dies wirklich ist, wie es jetzt in Delphi getan hat, aber ich bin mir ziemlich sicher, das ist, was Sie nach.

Delphi-Installation kommt mit einem Demo namens 'Bitmap' (Sie das Projekt in der Hilfe dir finden.).

Es verwendet das folgende Verfahren ein gefliestes Bild zu zeichnen:

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;

Ich hoffe, das hilft!

Mit dem „passenden“ meinst du mit „Kacheln“? Soweit ich weiß, hat TImage das nicht aus dem Kasten heraus unterstützen. Sie würden von Hand haben, um Ihr Bild auf der Leinwand in ein sich wiederholendes Muster von TImage zu zeichnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top