当前位置:编程学习 > C#/ASP.NET >>

关于合成图片之后内存释放问题,在线等

我写了一个方法是用来合成图片,但是程序跑了一段时间,打开任务管理器查看内存占用率会不断上涨,
最后报出内存溢出,求高手解决
代码如下:

        private MemoryStream ms;

        private Bitmap bImage;

        private System.Drawing.Image img;

        private Graphics g;

        /// <summary>
        /// 获取合成图片后的字节大小
        /// </summary>
        /// <param name="_al">要合成的每张图片的大小数组</param>
        /// <param name="_width">合成后的宽度</param>
        /// <param name="_height">合成后的高度</param>
        /// <returns>byte[]</returns>
        public byte[] GetCompose(ArrayList _al, int _width, int _height)
        {
            byte[] tp = null;

            try
            {
                using (ms = new MemoryStream())
                {

                    bImage = new Bitmap(_width, _height);

                    bImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

                    img = System.Drawing.Image.FromStream(ms);

                    using (g = Graphics.FromImage(img))
                    {
                        //计算坐标代码
                        IList<Rectangle> rectList = CalcPanelRectangle(_al.Count, bImage.Size);

                        byte[] bytes;

                        for (int pic_i = 0; pic_i < rectList.Count; pic_i++)
                        {
                            bytes = (byte[])_al[pic_i];
                            using (Stream stream = new MemoryStream(bytes))
                            {
                                using (Bitmap bmp1 = new Bitmap(stream))
                                {
                                    g.DrawImage(bmp1 , rectList[pic_i], 0, 0, bmp1.Width, bmp1.Height, GraphicsUnit.Pixel);
                                }
                            }
                        }
                        tp = ImageToByteArray(img);
                    }
                }
                return tp;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

经测试是由for循环里引起的,但是不知道怎么解决。 --------------------编程问答-------------------- 每次调用一下ms的close,或者每个循环末加一个GC.Collect试试吧,因为gc不会实时回收的,所以你如果过于频繁创建,空间可能不够用 --------------------编程问答-------------------- 这种说法不正确,GC.Colect回收的是托管资源,MemeryStream申请的是非托管的内存,GC.Collect是不能回收的。

过于频繁创建,空间可能不够用 也不正确,如果频繁的创建对象,在heap虚拟内存不够,那么GC会启用自动回收,如果3个内存区都没有内存块可申请,那么会抛出一个内存泄露的异常

引用 1 楼  的回复:
每次调用一下ms的close,或者每个循环末加一个GC.Collect试试吧,因为gc不会实时回收的,所以你如果过于频繁创建,空间可能不够用
--------------------编程问答-------------------- /// 合并图片
        private Bitmap MergerImg(Dictionary<string, Bitmap> bitMapDic)
        {
            if (bitMapDic == null || bitMapDic.Count == 0)
                throw new Exception("图片数不能够为0");
            Bitmap backgroudImg = new Bitmap(bitMapDic.Count * 12, 16);
            Graphics g = Graphics.FromImage(backgroudImg);

            //清除画布,背景设置为白色
            g.Clear(System.Drawing.Color.White);

            int j = 0;
            foreach (KeyValuePair<string, Bitmap> entry in bitMapDic)
            {
                Bitmap map = entry.Value;
                g.DrawImage(map, j * 11, 0, map.Width, map.Height);
                j++;
            }
            g.Dispose();
            return backgroudImg;
        }
http://topic.csdn.net/u/20100531/17/f4eb4974-604b-4992-8c87-9afe5b6e1863.html --------------------编程问答--------------------
引用 1 楼  的回复:
每次调用一下ms的close,或者每个循环末加一个GC.Collect试试吧,因为gc不会实时回收的,所以你如果过于频繁创建,空间可能不够用

ms close掉就不能继续合图片了,因为需要常打开;
GC.Collect试过内存还是会上涨。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,