如何在 FMX.Graphics.TBitmap 上绘制 FMX.Surface.TBitmapSurface

How to draw FMX.Surface.TBitmapSurface on FMX.Graphics.TBitmap

后续:

我需要在 FMX.Graphics.TBitmap 上绘制 TBitmapSurface 上的内容,我在网上找到了很多关于此的答案,但它们要么在 VLC 中而不是 FMX 或者他们的目标是 savingloading 而不是借鉴 TBitmap,这就是为什么我在这里问了一个新问题。
现在这是我在 TBitmapSurface 上加载图像的当前代码:

var
  bitmapSurf: TBitmapSurface;
  path: string;
begin
  path := 'image.jpg';
  bitmapSurf := TBitmapSurface.Create;
  TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
end;

现在搜索了一下,我发现我可以在 TBitmapSurface 上使用 Scanline,但我不知道如何使用它在 TBitmap 上绘图,网上有些人用过 TBitmap.canvas.draw,但 FMX!.
上没有这样的东西 最后我的目标是绘制一个非常大的图像(1000*16000)加载到 TBitmapSurface1 TBitmap (因为 TBitmap 不支持超过 8192px 而我的身高是 16000px,我需要在两个 TBitmap 上画这个。
我正在使用 Delphi 10.2.3.
谢谢。

您可以将大图像(来自文件)拆分为两个 TImage 组件,如下所示

像您在代码中所做的那样,将图像从文件加载到 TBitmapSurface

然后创建另一个TBitmapSurface并将其大小设置为大的一半。把大图的前半部分复制到这个surface,赋值给Image1.Bitmap。然后将后半部分复制到这个表面并将其分配给 Image2.Bitmap.

var
  srce, dest: TBitmapSurface;
  path: string;
  scan: integer;
  w, h1, h2: integer;
begin
  path := 'C:\tmp\Imgs\res.bmp';

  srce := TBitmapSurface.Create;
  try
    TBitmapCodecManager.LoadFromFile(path, srce);

    dest := TBitmapSurface.Create;
    try
      // first half
      w := srce.Width;
      h1 := srce.Height div 2;
      dest.SetSize(w, h1, TPixelFormat.RGBA);
      for scan := 0 to h1-1 do
        Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan]^, srce.Width * 4);
      Image1.Bitmap.Assign(dest);

      // second half
      h2 := srce.Height - h1;
      dest.SetSize(w, h2, TPixelFormat.RGBA);
      for scan := h1 to srce.Height-1 do
        Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan-h1]^, srce.Width * 4);
      Image2.Bitmap.Assign(dest);

    finally
      dest.Free;
    end;
  finally
    srce.Free;
  end;