我写了一个方法是用来合成图片,但是程序跑了一段时间,打开任务管理器查看内存占用率会不断上涨,
最后报出内存溢出,求高手解决
代码如下: 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循环里引起的,但是不知道怎么解决。
最后报出内存溢出,求高手解决
代码如下: 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循环里引起的,但是不知道怎么解决。
解决方案 »
- 求一算法 (关于 TreeView 的)
- 求能为这个网页用webbrowser填充textarea的代码
- 都是男人,你们想不想....
- 写入app.config的几个问题?
- datagridview中的某一行显示为红色
- 如何在程序中修改注册表
- datagridview删除行后,定位新行,怎么老是第一行?
- 怎么使MessageBox中的信息字符串换行显示??
- 如何捕捉listview滚动条事件,最好具体点,如何设置响应消息什么的,我不懂,希望大家帮忙
- 高分求助
- 如何用C#查询sql Server 2005中是否存在“表名”表,如果不存在则使用此“表名”创建表
- 求c#大神帮我解决简单问题,我是新手
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
GC.Collect试过内存还是会上涨。