-2

我尝试用 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;
4

1 回答 1

8

我怀疑您可能正在加载相机照片(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这样的工具,这些工具可以帮助跟踪程序中的内存泄漏。

于 2013-08-30T09:59:38.650 回答