不同文件中的Delphi FMX PaintTo()

时间:2018-07-12 21:51:31

标签: delphi firemonkey

我有一个小问题,我试图将TLayout(LayoutScale)的一部分保存在Timage(ImmagineCreata)中。由于TLayout(LayoutScala)非常大,我想在很多8000x8000的图像中都将其分解,但是我得到的是许多尺寸正确但全白的图像,只有第一张图像充满了TLayout的所有内容,但爬到了8000x8000

    procedure TForm1.Button1Click(Sender: TObject);
var ImmagineCreata : FMX.Graphics.TBitmap;
    NumImgX, NumImgY, x, y, dimensioneX, dimensioneY : integer;
begin
  if (LayoutScala.Width > 8000) or (LayoutScala.Height > 8000) then
  begin
    //valuta il numero di immagini da fare in x e in y
    NumImgX := 1 + (Round(LayoutScala.Width)  div 8000);
    NumImgY := 1 + (Round(LayoutScala.Height) div 8000);
    //salva le immagini
    for y := 1 to NumImgY do
    begin
      //dimensione lato in y
      dimensioneY := 8000;
      if (y = NumImgY) then dimensioneY := Round((NumImgY * 8000) - LayoutScala.Height);
      //valuta l'altro verso
      for x := 1 to NumImgX do
      begin
        //dimensione lato in x
        dimensioneX := 8000;
        if (x = NumImgX) then dimensioneX := Round((NumImgX * 8000) - LayoutScala.Width);
        // Crea il rettangolo di disegno con le dimensioni dell'immagine
        ImmagineCreata := FMX.Graphics.TBitmap.Create(dimensioneX, dimensioneY);
        ImmagineCreata.Clear(TAlphaColorRec.White);
        ImmagineCreata.Canvas.BeginScene;
        //Traccia il controllo e i suoi figli nel bitmap di destinazione
        try LayoutScala.PaintTo(ImmagineCreata.Canvas, RectF((x-1)*8000, (y-1)*8000, ((x-1)*8000)+dimensioneX, ((y-1)*8000)+dimensioneY));
        finally ImmagineCreata.Canvas.EndScene;
        end;
        // Salva l'immagine
        ImmagineCreata.SaveToFile('C:\Immagine'+x.ToString+'.'+y.ToString+'.jpg');
        //svuota la memoria
        ImmagineCreata.Free;
      end;
    end;
  end;
end;

enter image description here

我使用Delphi 10.2.3和FireMonkey

2 个答案:

答案 0 :(得分:0)

在您的行中     try LayoutScala.PaintTo(ImmagineCreata.Canvas..) 我相信您会误解TLayout.PaintTo(ACanvas, ARect)方法。 ARect 指定要绘制的 ACanvas (目标)的矩形区域,而不是源画布中的矩形。

因为您在目标位图之外写入了所有平方(第一个x = 1,y = 1除外),所以对于其他所有x和y组合,您只能得到白色位图。

要获得所需结果,您需要首先将整个布局复制到一个中间位图(与TLayout的大小相同),然后在嵌套的for循环内使用x和y方法Bitmap.Canvas.DrawBitmap允许您移交源矩形和目标矩形。

答案 1 :(得分:-1)

我通过自动移动滚动条并创建屏幕截图来解决