【问题标题】:Firemonkey loading multiple images memory overloadFiremonkey加载多个图像内存过载
【发布时间】:2013-08-30 09:34:35
【问题描述】:

我尝试用 FireMonkey 编写照片编辑器。我有 50 个在运行时创建的 TImage 组件。如果我将大图像(大约 3 MB)加载到这些组件中,我会收到“内存过载”错误。

这是我的图片传输代码;

img1:=(sender as timage).Name;
strm:=TMemoryStream.Create;
(data.Source as timage).Bitmap.SaveToStream(strm);
(sender as timage).Bitmap.LoadFromStream(strm);
strm.Free;

【问题讨论】:

  • 请显示实际的错误信息
  • ...更多代码也会有所帮助,操作系统详细信息也会有所帮助。
  • 这就像试图将一加仑牛奶倒进一个小杯子里,却想知道为什么它会溢出来。

标签: image delphi memory firemonkey


【解决方案1】:

我怀疑您可能正在加载相机照片(JPG 格式)。这些可能是约 8-10 兆像素的图像。加载到 TBitmap 时,您会丢失 JPG 压缩,因此它们不再是 3MB 文件,而是 (#MP X 24bpp)。对于需要大约 30MB RAM 的 10MP 图像。对于 50 个这样的图像,这是 1.5GB。在 32 位 Windows 上,这可能会使您超出系统的可寻址内存限制。

您需要考虑的是,您是否需要同时打开 50 张全尺寸图像并将其存储在 RAM 中。除非你正在做巨大的 Photoshop 规模的图形设计,否则真的没有必要一次在 RAM 中拥有 5 亿像素的数据。 Photoshop 使用它自己的内置磁盘缓存系统来解决这个问题。如果您真的需要这种规模的灵活性,那么您将需要实现类似的东西。

当然,前提是您没有泄漏内存。 1.5GB,虽然非常大,但在 64 位系统上应该没有问题,即使在 32 位进程中(假设您使用 {$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 编译)。如果是这种情况,那么您需要开始研究像 FastMM4 这样的工具,这些工具可以帮助您跟踪程序中的内存泄漏。

【讨论】:

  • 关于最后一段,仅当 32 位进程构建大地址感知。即便如此,内存碎片也可能是个问题。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2010-12-11
相关资源
最近更新 更多