压缩图像时C#中的内存泄漏

时间:2016-04-27 09:12:31

标签: c# visual-studio memory-leaks imagemagick

我尝试在内存中压缩ImageSource MagickImage。但它消耗了太多的内存。使用VS性能工具,此方法的每次调用都会占用大量内存。一旦存在它应该需要0Mb,对吗?

internal static System.Windows.Media.ImageSource compressImage(System.Windows.Media.ImageSource ims)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                using (MemoryStream outS = new MemoryStream())
                {
                    BitmapSource bs = ims as BitmapSource;
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    BitmapFrame bf = BitmapFrame.Create(bs);
                    //encoder.Frames.Add(BitmapFrame.Create(image1.Source));
                    encoder.Frames.Add(bf);
                    encoder.Save(stream);
                    stream.Flush();

                    try
                    {
                        // Read first frame of gif image
                        using (MagickImage image = new MagickImage(stream))
                        {
                            image.Quality = 75;
                            image.Resize(new Percentage(0.65));
                            image.Density = new Density(200, DensityUnit.PixelsPerInch);
                            image.Write(outS);
                        }

                        stream.Close();
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.BeginInit();
                        bitmap.CacheOption = BitmapCacheOption.OnLoad;
                        outS.Position = 0;
                        bitmap.StreamSource = outS;
                        //
                        bitmap.EndInit();
                        //bitmap.Freeze();
                        outS.Flush();
                        outS.Close();
                        ims = null;
                        return bitmap;
                    }
                    catch (Exception e)
                    {
                        return null;
                    }
                }
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

因为图像逐像素存储在存储器中。它将消耗大量内存取决于其大小。 指定它的大小会减少很多内存。

bitmap.DecodePizelWidth = 800;