3

I try to compress ImageSource with MagickImage in memory. But it consumes too much memory. With VS performance tool, every call of this method with consume a lot of memory. It should take 0Mb once it exists, right?

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;
                    }
                }
            }

        }
    }
Xiaokun
  • 814
  • 2
  • 10
  • 26

1 Answers1

0

Since Image is stored in memory pixel by pixel. It will consume much memory depends on its size. Specifying its size will reduce much memory.

bitmap.DecodePizelWidth = 800;
Xiaokun
  • 814
  • 2
  • 10
  • 26