保存/使用图像而不分配 300mb 内存
Posted
技术标签:
【中文标题】保存/使用图像而不分配 300mb 内存【英文标题】:Save/Use images without allocating 300mb memory 【发布时间】:2012-09-10 11:06:17 【问题描述】:我正在用 .net 4.0 c# 构建一个 windows 项目。
我现在正在将图像保存到硬盘驱动器,这根本不会占用任何内存,因为我只是在我想查看图像时才加载图像。但现在我需要删除在硬盘驱动器中创建图像并以其他方式创建它。就像创建内存流并将其保存到对象并将其序列化到硬盘驱动器一样。重要的部分是我无法在硬盘驱动器中看到图像,它们必须加密或在对象或其他东西中。
所以....当我尝试将其放入内存流并将其保存到列表中然后将其序列化到驱动器时,我得到了巨大的程序内存分配,因为对于我创建的每个图像,并保存为内存流在我的列表中,我分配了那个内存,我的程序变得超过 2-300 mb。
我真的不知道如何做到这一点,我可以以某种方式将其保存到内存流中而不是在程序中分配该内存吗?或者可以以其他方式保存它,而不会使图片在硬盘驱动器中完全显示为图像?
正如我所说,我不能将图像作为普通图像保存在硬盘驱动器上,如果没有应用程序,用户必须无法查看它们。而且我需要找到一种不分配所有计算机内存的方法。
提前谢谢你!
【问题讨论】:
【参考方案1】:将其保存到内存流中,而不是在程序中分配该内存
没有。如果它在内存流中,它显然在 RAM 中。
因此,您需要将图像完全存储在 RAM 中,或者将其保存到磁盘。
如果您不希望它在磁盘上可见,那么您需要对文件进行加密,以便用户无法在您的应用程序之外查看它。加密的强度取决于您希望破解的难度。如果您不太在意,那么非常基本的 XOR 加密将非常快并且不会增加文件的大小。如果您确实关心,那么您想使用 3DES 之类的东西。
【讨论】:
这仍然会让我将所有图像文件逐个文件创建到硬盘驱动器,我希望找到一种方法来创建一个文件并将所有图像保存到其中,但也许不可能?但我一定会检查加密。 如果你想要一个包含所有图像的文件,那么你可以设计你自己的格式来存储它们,或者只是将它们全部放入一个随机文件名的 ZIP 文件中并加密。 你的意思是设计你自己的格式?它们会保存在该文件的列表中吗?如果我将所有内容都放在一个文件中,这不会增加内存分配吗? 就是这样,决定一种将所有图像存储在一个大块中的方法。如果这不是你知道该怎么做的事情,那就把它塞进拉链里。分配的内存量完全取决于您尝试加载到 RAM 中的数据量,因此这完全取决于您仅将当前正在使用的图像和未使用的图像保留在磁盘上的程度。 我将无法使用 zip 文件,因为如果不先解压缩文件等,我将无法访问这些文件。但我有兴趣把所有的东西都放在一个大块上,你有更多关于这方面的信息吗?就像我如何将所有图像保存到 blob 文件一样,我是否有一个包含所有图像的列表?【参考方案2】:文件访问是建立在streams的原理之上的,可以串联成一个链。你可以做的是,不是通过文件流直接从磁盘读取/写入图像,而是在它之间插入一个CryptoStream
。
【讨论】:
这是为了将图像创建为“加密”,还是至少在没有应用程序的情况下无法查看? @syncis:通过将图像保存为“加密”在磁盘上,您只能使用您的应用程序查看文件(因为它只知道如何解密)。 没能把它变小,所以这个答案对我有帮助。【参考方案3】:您可以使用 GZIPStream 和 CryptoStream 使图片更小和加密。
本文向您展示了具体方法;
http://www.liensberger.it/web/blog/?p=33
【讨论】:
以上是关于保存/使用图像而不分配 300mb 内存的主要内容,如果未能解决你的问题,请参考以下文章