如何在 FMX(火猴)中加载大位图

How to load large bitmap in FMX (fire monkey)

我正在尝试创建一个 Manga 查看器,它需要加载 JPG 大尺寸图像,如 1000*16000,我的应用程序在 delphi FMX 中,我已经尝试使用 TImageTImageViewerTImageControl,但它们都使用 TBitmap,在加载图像后将尺寸调整为 8192
我尝试搜索图像库,但找不到 FMX (firemonkey)
的任何内容 我在想也许我可以将图像加载到 Memory stream 中,然后将其复制并以较小的尺寸绘制到多个位图中?但我不知道如何读取和解析内存流,只选择一个特定的干净高度!
最后我正在寻找一种方法来加载和显示 Delphi FMX
中的这些大 (1000*16000) 图像 我正在使用 delphi 10.2.3
谢谢

编辑 01 :
我想我已经找到了一种可能使事情变得简单的方法,我将 Vcl.Imaging.jpeg 添加到 FMX (FireMonkey) 中的 uses 子句,然后我使用 TJPEGImage 并加载图像,然后打印宽度和身高,它们是正确的,没有修剪过!所以我在想,也许我可以从 TJPEGImage.canvas 中读取每个像素,然后将其打印到 FMX TBitmap 中?,您如何看待这种方法?,您知道将数据复制到 [= 中的好方法吗? =23=] 到 FMX TBitmap

编辑 02 :
我找到了一个新的解决方案,TBitmapSurface,这个 class 似乎没有 TBitmap 的限制,我能够在不修剪的情况下加载图像!但有个问题!我怎样才能把这个给 TImage ?如果我简单地说 Image.bitmap.assign(TBitmapsurface),那么图像会再次被裁剪!所以似乎唯一可能的方法是重写 TImage,因此它使用 TBitmapSurface 而不是 TBitmap,感谢任何有关此问题的帮助,谢谢。
这是 TBitmapSurface 的代码:

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

不像 FMX.Graphics.TBitmap8192 * 8192 的大小限制,FMX.Surface.TBitmapSurface 似乎最多支持 16k * 16k 甚至更多(我没有测试过),所以使用 FMX.Surface.TBitmapSurface 你可以在不修剪的情况下加载图像,然后你可以轻松地将它分成两个 FMX.Graphics.TBitmap (或者可能使用相同方法的更多部分)
下面您可以看到首先将 JPG 加载到 TBitmapSurface 中的代码,然后是将其拆分为两个 TBitmap : [=21] 的代码=]

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

  dest := TBitmapSurface.Create;

  // 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);

end;  

这个答案是根据第一个 post 的评论和我的另一个问题的答案提供的: