位图和内存

时间:2014-06-20 20:30:53

标签: c# memory bitmap

我正在使用一个使用大量位图的.Net应用。

如果我的所有位图都是灰度级,那么将Bitmap对象设置为32bpp是否明智?

我问,因为这是我使用的默认PixelFormat。我想知道如果将图像转换为16bpp或8bpp,它会减少每个位图对象在内存中使用的大小吗?

底线,是否从PixelFormat.Format32bppRgb更改为PixelFormat.Format16bppGrayScale会将每个Bitmap实例的内存使用量减少一半?

谢谢,

2 个答案:

答案 0 :(得分:3)

存储位图所需的内存在很大程度上与像素存储格式的大小成比例。因此,8位灰度位图将是32位RGBA位图大小的四分之一。

我说很大程度上是因为存在与位图相关的开销。由于扫描线对齐要求,存在填充。但只要图像数据(像素)足够大,它们就会占主导地位。所以上面简单的经验法则是准确的。

答案 1 :(得分:1)

位图很复杂。大卫的答案只是部分正确。由于GDI使用三重缓冲,位图占用了所需内存的三倍。这是一个实现细节,可以通过例如使用不同的Bitmap ctor在GDI中调用不同的ctor。

直到今年4月,Windows 7到Windows 8.1都有一个错误,即Bitmaps确实占用了3 * 64KB = 192KB的地址空间,无论你的位图有多小。我确实向MS报告了这个错误,这是MS第一次通过告诉我不要这样做而改变了我的想法,但他们在Windows中解决了这个问题。见http://geekswithblogs.net/akraus1/archive/2014/01/03/155056.aspx。是灰度会减少内存占用,但根据操作系统的补丁级别,您仍然可以快速运行32位以下的地址空间。最好的办法是将位图保留在光盘上并仅在您真正需要它们时加载它们。一个400字节大小的压缩32bpp rgb位图(例如48x48图标)将膨胀到内存中大约3 * 6 KB,这比原始图标大很多。

引擎盖下GDI位图现在使用WIC(Windows Imaging Component),可能会在未来再次打补丁,无论好坏。