【问题标题】:Delphi FMX PaintTo() in different fileDelphi FMX PaintTo() 在不同的文件中
【发布时间】:2018-07-12 21:51:31
【问题描述】:

我有一个小问题,我正在尝试将 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

【问题讨论】:

  • 8000×8000 像素大小的图片已经很大了。我会把它切成小块。例如,许多地图应用程序创建者使用 256×256 像素大小的图像。
  • 请不要将代码作为图像发布。这完全是无用的浪费。
  • 但是有什么解决办法呢?

标签: delphi firemonkey


【解决方案1】:

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

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

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

【讨论】:

  • 我无法在 TBitmap 中传递 TLayout,因为 TBitmap 大于 10000x10000,因此无法创建
  • 通常 firemonkey 将 TBitmap 大小限制为 65536 x 65536 像素,但在 Windows 平台上 DirectX 将 TBitmap 大小进一步限制为 8192 x 8192 像素。我没有看到从画布中仅获取部分矩形的替代方法。方法“TControl.PaintTo”重定向画布并调用始终绘制整个区域的 PaintInternal 方法。与 VCL TCanvas 相反,firemonkey TCanvas 至少不提供属性像素来逐个像素地访问。这就是为什么您必须考虑应用程序的另一种结构。你如何填充布局?
【解决方案2】:

我通过自动移动滚动和创建屏幕截图解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2017-09-17
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多