2013-10-31 18 views
0

System.Drawing.Imaging.Imageformat中哪种格式是哪些场景的最佳选择?Imaging.Imageformat哪一个最适合内存管理

我对应用程序内存消耗以及图像质量感兴趣。

在我的应用程序中,图像在内存中加载的质量不是优先级,只是图像中的内容应该可见,哪种Imageformat最适合在这里?

+1

您可以使用BitmapImage上的DecodePixelWidth或DecodePixelHeight让WPF创建质量较低的图像(较低的分辨率)... don除非你知道宽高比.....,那么它们在加载时会占用更少的内存......或者你可以使用RenderTargetBitmap来创建一个更小的图像,例如:http://blogs.msdn .COM/b /延迟/存档/ 2007/11/11 /大-ISN叔总是更好的how-to-调整图像,而无需-重装了他们,与-WP f.aspx –

+0

@colinsmith谢谢,我已经使用decodepixelWidth,虽然没有节省太多的空间.RenderTargetBitmap,我会看看。虽然这真的很有帮助链接张贴。 – Jay

+1

您肯定会一次显示许多小图像或少量大图像。因此,解决您的问题的方法是将PixelWidth/PixelHeight减少到所需的最小值,并仅加载实际显示在屏幕上的图像。在实际显示在屏幕上之前,不要加载所有大图像。 – Clemens

回答

1

内存管理无关 - ImageFormat用于在将内存位图保存到IO流(例如磁盘上的文件)时控制格式。在.NET中的

Image要么是Bitmap或要么是Metafile。我相当肯定你正在使用Bitmap,这意味着你创建的每个实例将总是占用Stride * Height * PixelFormat字节的内存。

尽管可以在内存中存储压缩良好的PNG或JPEG图像的字节(可能在MemoryStreamByte[]阵列中),但您无法对其执行任何操作(例如,在屏幕上显示它,修改图像的像素等),直到它在内存中表现为光栅位图,因为这是GDI +(即System.Drawing.*)所需要的。 (是的,也有例外,例如将JFIF加载到内存中,并操纵DCT块(a la jpegtran),或者使用Direct3D或OpenGL等图形API,它能够将压缩图像直接读入显卡的内存(但即使如此,纹理依然会以光栅格式存储在内存中)

+0

我尝试过使用.png,jpeg,bmp,memorybmp所有格式都消耗我的RAM中几乎相似的空间。有没有办法通过降低图像质量来减少内存空间?为了减少在UI上显示数千个图像时的内存使用量,与位图使用相对应的技巧有哪些? – Jay