如何在 FMX(火猴)中加载大位图
How to load large bitmap in FMX (fire monkey)
我正在尝试创建一个 Manga 查看器,它需要加载 JPG
大尺寸图像,如 1000*16000,我的应用程序在 delphi FMX 中,我已经尝试使用 TImage
、TImageViewer
、TImageControl
,但它们都使用 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.TBitmap
有 8192 * 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 的评论和我的另一个问题的答案提供的:
我正在尝试创建一个 Manga 查看器,它需要加载 JPG
大尺寸图像,如 1000*16000,我的应用程序在 delphi FMX 中,我已经尝试使用 TImage
、TImageViewer
、TImageControl
,但它们都使用 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.TBitmap
有 8192 * 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 的评论和我的另一个问题的答案提供的: