加载许多Bitmap对象时节省RAM

时间:2010-07-28 09:30:59

标签: c# image bitmap

将bmp或png(或其他格式)中的相同图像加载到位图时有什么区别吗?原始图像格式是否会影响RAM中的Bitmap对象大小?

有没有办法归档Bitmap个对象,以减少RAM资源消耗?

2 个答案:

答案 0 :(得分:1)

大小只受文件大小的影响,无论格式如何(但很明显,某些格式会导致文件比其他格式更小)。

存档位图的一种方法是,如果你需要将它们保存为位图,只需将它们压缩即可。或者,将它们转换为包含压缩的另一种图像格式(理想情况下,无损压缩,因此不是jpg)。对不起,这解释了归档文件,而不是保存实时内存使用。

要使用内存停止位图对象,您需要释放内存中的项目,并在需要再次使用时重新加载它。或者,虽然我没有这方面的经验,但请查看新的.NET 4内存映射文件。

答案 1 :(得分:0)

有两种方法可以将数据保存在内存中

  1. 使用内存中的GZipStream序列化和压缩对象
  2. 将图像保存到临时目录,如果需要,将其读取为ram。
  3. 图像对象大小不受原始图像格式的影响。但保存对象的流的大小确实如此。

    以下是如何从对象获取流的方法:

     public static Stream GetPNGBitmapStream(Image initial)
        {
            return GetBitmapStream(initial, "image/PNG");
        }
    
        public static Stream GetJPGBitmapStream(Image initial)
        {
            return GetBitmapStream(initial, "image/jpeg");
        }
    
        private static Stream GetBitmapStream(Image initial, string mimeType)
        {
            MemoryStream ms = new MemoryStream();
    
            var qualityEncoder = Encoder.Quality;
            var quality = (long)90;
            var ratio = new EncoderParameter(qualityEncoder, quality);
            var codecParams = new EncoderParameters(1);
            codecParams.Param[0] = ratio;
            ImageCodecInfo[] infos = ImageCodecInfo.GetImageEncoders();
    
            ImageCodecInfo jpegCodecInfo = null;
            for (int i = 0; i < infos.Length; i++)
            {
                if (string.Compare(infos[i].MimeType, mimeType,true) == 0)
                {
                    jpegCodecInfo = infos[i];
                    break;
                }
            }
    
            if (jpegCodecInfo != null)
            {
                initial.Save(ms, jpegCodecInfo, codecParams); 
                MemoryStream ms2 = new MemoryStream(ms.ToArray());
                ms.Close();
                ms.Dispose();
                return ms2;
            }
    
            return null;
        }