我正在尝试创建一个Manga查看器,它需要加载像1000*16000这样大尺寸的JPG
图像,我的应用程序是delphi,我已经尝试过使用TImage
、TImageViewer
、TImageControl
,但是它们都使用TBitmap
,在加载图像后将大小调整到8192
。
我试着搜索映像库,但是找不到FMX (firemonkey)
的任何东西。
我在想,也许我可以将图像加载到一个Memory stream
中,然后将其复制并绘制成几个位图?但是我不知道我怎么能读取和解析内存流,只选择一个干净的高度!
最后,我正在寻找一种在Delphi FMX
中加载和显示这些大型(1000*16000
)图像的方法
我正在使用delphi 10.2.3
谢谢。
编辑01 :
我想我找到了一种可以让事情变得简单的方法,我在FMX (FireMonkey)
中添加了uses子句,然后我使用TJPEGImage
并加载了图像,我打印了宽度和高度,它们是正确的而不是修剪的!所以我在想,也许我可以从TJPEGImage.canvas
中读取每个像素,然后把它打印到FMX TBitmap
中?你认为这种方法怎么样?你知道把TJPEGImage
内部的数据复制到FMX TBitmap
中的好方法吗?
编辑02 :
我找到了一个新的解决方案,TBitmapSurface
,似乎这个类没有TBitmap
的限制,而且我能够在不被修剪的情况下加载图像!但有个问题!我怎样才能把这个交给TImage
?如果我简单地说Image.bitmap.assign(TBitmapsurface)
,那么图像将再次被裁剪!因此,似乎唯一可能的方法是重写TImage
,使其使用TBitmapSurface
而不是TBitmap
,非常感谢对此问题的任何帮助。
下面是TBitmapSurface
的代码:
bitmapSurf := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
发布于 2018-07-25 21:06:55
与FMX.Graphics.TBitmap
不同,FMX.Surface.TBitmapSurface
的大小限制为8192 * 8192
,FMX.Surface.TBitmapSurface
似乎支持16k * 16k
,甚至可能更多(我还没有测试),所以使用FMX.Surface.TBitmapSurface
可以加载映像而不需要修剪,然后可以轻松地将其分割成两个FMX.Graphics.TBitmap
(或者使用相同的方法可以将更多的部分)。
下面的代码可以看到首先将JPG
加载到 TBitmapSurface
**,中,然后将其拆分为两个** TBitmap
的代码
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;
这一答复是根据对第一篇文章的评论和对我另一个问题的答复提出的:
How to draw FMX.Surface.TBitmapSurface on FMX.Graphics.TBitmap
https://stackoverflow.com/questions/51466186
复制相似问题