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

时间:2018-07-22 14:39:34

标签: image delphi bitmap firemonkey

我正在尝试创建一个漫画查看器,该查看器需要加载JPG大尺寸图像(如1000 * 16000),我的应用程序是在delphi FMX中,并且我已经尝试使用TImage,{{1 }},TImageViewer,但所有人都使用TImageControl,这会在加载图像后将尺寸调整为TBitmap
我尝试搜索图片库,但找不到8192的任何内容
我在想,也许我可以将图像加载到FMX (firemonkey)中,然后将其复制并绘制为较小的尺寸,以绘制几个位图?但是我不知道如何读取和解析内存流,而只能选择一个干净的高度!
最后,我正在寻找一种加载并显示Memory stream中的大图像(1000*16000)的方法
我正在使用delphi 10.2.3
谢谢。

编辑01:
我认为我找到了一种可能使事情变得容易的方法,我在Delphi FMX的{​​s1}}中添加了use子句,然后使用Vcl.Imaging.jpeg并加载了图像,并打印了宽度和高度,他们是正确的,没有修剪!所以我在想,也许我可以从FMX (FireMonkey)中读取每个像素,然后将其打印到TJPEGImage中?您对这种方法有何看法?您知道在{中复制数据的好方法吗?从{1}}到TJPEGImage.canvas

编辑02:
我找到了一个新的解决方案FMX TBitmap,看来该类没有TJPEGImage的限制,而且我能够在其中加载图像而不会被修剪!但有个问题!我该如何给FMX TBitmap?如果我只是说TBitmapSurface,则图像会再次被修剪!因此,似乎唯一可行的方法是重写TBitmap,使其使用TImage而不是Image.bitmap.assign(TBitmapsurface),有关此问题的任何帮助都将受到感谢。
这是TImage的代码:

TBitmapSurface

1 个答案:

答案 0 :(得分:0)

与大小限制为FMX.Graphics.TBitmap的{​​{1}}不同,8192 * 8192似乎支持多达FMX.Surface.TBitmapSurface甚至可能更多(我尚未测试),因此请使用16k * 16k可以加载图像而不会被修剪,然后可以轻松地将其拆分为两个FMX.Surface.TBitmapSurface(或使用相同的方法可以将更多部分拆分)
在下面,您将看到首先将FMX.Graphics.TBitmap加载到JPG中的代码,然后将其拆分为两个TBitmapSurface的代码:

TBitmap

此答案是使用第一篇文章的评论和我的其他问题的答案提供的:
How to draw FMX.Surface.TBitmapSurface on FMX.Graphics.TBitmap