我尝试用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;
答案 0 :(得分: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之类的工具,这些工具可以帮助跟踪程序中的内存泄漏。