Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi FMX painto()位于不同的文件中_Delphi_Firemonkey - Fatal编程技术网

Delphi FMX painto()位于不同的文件中

Delphi FMX painto()位于不同的文件中,delphi,firemonkey,Delphi,Firemonkey,我有一个小问题,我正试图将一部分TLayout(LayoutScale)保存在Timage(ImmagineCreata)中。由于TLayout(LayoutScala)非常大,我想将其分解为许多图像8000x8000,但我得到的是许多大小正确的图像,但都是白色的,只有第一个图像填充了TLayout的所有内容,但却爬到了8000x8000上 procedure TForm1.Button1Click(Sender: TObject); var ImmagineCreata : FMX.G

我有一个小问题,我正试图将一部分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;

我使用Delphi 10.2.3和FireMonkey在您的产品线中
尝试LayoutScala.painto(ImmagineCreata.Canvas..)
我相信您误解了
TLayout.painto(ACanvas,ARect)
方法。 ARect指定要绘制的acanva(目标)的矩形区域,而不是源画布中的矩形区域

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


为了得到想要的结果,您需要首先将整个布局复制到中间位图(与TLayout大小相同)并在x和y的嵌套for循环中使用方法
Bitmap.Canvas.DrawBitmap
,该方法允许您切换源矩形和目标矩形。

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

8000×8000像素大小的图像已经非常大了。我会把它切成小块。例如,许多地图应用程序创建者使用256×256像素大小的图像。请不要将代码作为图像发布。这完全是无用的浪费。但解决方案是什么呢?我无法在TBitmap中通过TLayout,因为TBitmap大于10000x1000,因此无法创建。firemonkey通常将TBitmap大小限制为65536 x 65536像素,但在Windows平台上,DirectX将TBitmap大小进一步限制为8192 x 8192像素。我没有看到从画布中只提取部分矩形的替代方法。该方法“TControl.PaintTo”重定向画布并调用PaintInternal方法,该方法始终绘制整个区域。与VCL TCanvas相反,firemonkey TCanvas至少不提供逐像素访问的属性像素。这就是为什么您必须考虑应用程序的另一种结构。如何填充布局?