C# 位图与内存

C# 位图与内存,c#,memory,bitmap,C#,Memory,Bitmap,我正在开发一个使用大量位图的.Net应用程序 如果我所有的位图都是灰度的,那么将位图对象设置为32bpp是否有意义 我这么问是因为这是我使用的默认像素格式。我想知道我是否将图像转换为16bpp或8bpp,这将减少每个位图对象在内存中使用的大小 总之,从PixelFormat.Format32bppRgb更改为PixelFormat.Format16bppGrayScale是否会将每个位图实例的内存使用量减少一半 谢谢,存储位图所需的内存在很大程度上与像素存储格式的大小成正比。因此,8位灰度位图的

我正在开发一个使用大量位图的.Net应用程序

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

我这么问是因为这是我使用的默认像素格式。我想知道我是否将图像转换为16bpp或8bpp,这将减少每个位图对象在内存中使用的大小

总之,从
PixelFormat.Format32bppRgb
更改为
PixelFormat.Format16bppGrayScale
是否会将每个位图实例的内存使用量减少一半


谢谢,

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


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

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


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

位图很复杂。大卫的回答只是部分正确。由于GDI使用三重缓冲,位图占用的内存是它们所需内存的三倍。这是一个实现细节,可以通过使用不同的位图ctor(调用GDI中的不同ctor)来更改

直到今年4月,Windows7到Windows8.1都有一个bug,即不管位图有多小,位图都会占用3*64KB=192KB的地址空间。我确实向微软报告了这个错误,这是微软第一次改变主意,告诉我不要这样做,但他们在Windows中解决了这个问题。看见是的,灰度将减少内存占用,但根据操作系统的补丁级别,32位以下的地址空间仍然会很快用完。最好的办法是将位图保存在光盘上,并仅在您真正需要时加载它们。400字节大小的压缩32bpp rgb位图(例如48x48图标)将在内存中膨胀到3*6KB左右,比原始图标大得多


目前,GDI位图使用WIC(Windows图像组件),将来可能会对其进行修补,无论好坏

位图很复杂。大卫的回答只是部分正确。由于GDI使用三重缓冲,位图占用的内存是它们所需内存的三倍。这是一个实现细节,可以通过使用不同的位图ctor(调用GDI中的不同ctor)来更改

直到今年4月,Windows7到Windows8.1都有一个bug,即不管位图有多小,位图都会占用3*64KB=192KB的地址空间。我确实向微软报告了这个错误,这是微软第一次改变主意,告诉我不要这样做,但他们在Windows中解决了这个问题。看见是的,灰度将减少内存占用,但根据操作系统的补丁级别,32位以下的地址空间仍然会很快用完。最好的办法是将位图保存在光盘上,并仅在您真正需要时加载它们。400字节大小的压缩32bpp rgb位图(例如48x48图标)将在内存中膨胀到3*6KB左右,比原始图标大得多


目前,GDI位图使用WIC(Windows图像组件),将来可能会对其进行修补,无论好坏

你试过自己测试吗?不,我不知道如何转换图像。因此,如果答案是肯定的,它将减少它使用的内存,然后我将了解如何从32转换为16。您是否尝试过自己进行测试?不,我不知道首先如何转换图像。因此,如果答案是肯定的,它将减少它使用的内存,然后我将了解如何从32转换为16谢谢,那么如何将32bpp位图转换为8bpp或16bpp?请参见:Bitmap.SetResolution()这取决于具体情况。数据来自哪里。我想我应该将其存储为
format8bpindexed
,并使用灰度颜色表。但如何实现这一点实际上取决于我们没有的信息。谢谢,那么我如何才能将32bpp的位图转换为8bpp或16bpp呢?请参见:Bitmap.SetResolution()有点取决于。数据来自哪里。我想我应该将其存储为
format8bpindexed
,并使用灰度颜色表。但你如何做到这一点实际上取决于我们没有的信息。我对这些问题都不熟悉。三重缓冲?为什么要这样做?如果你说的是真的,那么我想
byte[,]
就是前进的方向。GDI充满了奇迹。上次我用堆分配评测和xperf检查了它。我所看到的不太好,我对这些问题都不熟悉。三重缓冲?为什么要这样做?如果你说的是真的,那么我想
byte[,]
就是前进的方向。GDI充满了奇迹。上次我用堆分配评测和xperf检查了它。我看到的不太好。