位图和内存

本文关键字:内存 位图 | 更新日期: 2023-09-27 18:09:31

我正在开发一个。net应用程序,它使用了大量的位图。

如果我所有的位图都是灰度,是否有意义的位图对象设置为32bpp?

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

底线,从PixelFormat.Format32bppRgbPixelFormat.Format16bppGrayScale的变化是否减少了每个位图实例的内存使用量的一半?

谢谢,

位图和内存

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

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

位图是复杂的。大卫的回答只是部分正确。由于GDI使用了三重缓冲,位图占用了所需内存的三倍。这是一个可以改变的实现细节,例如使用不同的位图函数调用GDI中不同的函数。

Windows 7到Windows 8.1有一个bug,直到今年4月,位图占用3*64KB = 192KB的地址空间,不管你的位图有多小。我确实向微软报告了这个bug,这是微软第一次改变我的想法,告诉我不要这样做,但他们在Windows中修复了这个问题。见http://geekswithblogs.net/akraus1/archive/2014/01/03/155056.aspx。是的,灰度会减少内存占用,但取决于你的操作系统的补丁级别,你仍然会很快用完32位以下的地址空间。最好的方法是将位图保存在磁盘上,只有在真正需要时才加载它们。一个压缩的32bpp rgb位图,400字节大小(例如一个48x48的图标)将在内存中膨胀到大约3*6 KB,这比原来的图标大得多。

在引擎盖下GDI位图现在使用WIC (Windows成像组件),将来可能会再次打补丁,无论是好是坏。