首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

memorystream写下内存提示内存不足

2012-10-30 
memorystream写入内存提示内存不足private Bitmap CreateBitmap(byte[] originalImageData, int originalW

memorystream写入内存提示内存不足
private Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
  {
  //指定8位格式,即256色.old
  //指定32位格式
  Bitmap resultBitmap = new Bitmap(originalWidth, originalHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  try
  {
  //将该位图存入内存中
  MemoryStream curImageStream = new MemoryStream();
  resultBitmap.Save(curImageStream, System.Drawing.Imaging.ImageFormat.Bmp);
  curImageStream.Flush();

  //由于位图数据需要DWORD对齐(4byte倍数),计算需要补位的个数
  //int curPadNum = ((originalWidth * 8 + 31) / 32 * 4) - originalWidth;
  int curPadNum = ((originalWidth * 24 + 31) / 32 * 4) - originalWidth;

  //最终生成的位图数据大小
  //int bitmapDataSize = ((originalWidth * 8 + 31) / 32 * 4) * originalHeight;
  int bitmapDataSize = ((originalWidth * 24 + 31) / 32 * 4) * originalHeight;
  //bitmapDataSize = originalWidth * originalHeight;
  //数据部分相对文件开始偏移,具体可以参考位图文件格式
  int dataOffset = ReadData(curImageStream, 10, 4);


  //改变调色板,因为默认的调色板是32位彩色的,需要修改为256色的调色板
  int paletteStart = 54;
  int paletteEnd = dataOffset;
  //int color = 0;

  //RPG24,不需要调色板
  //for (int i = paletteStart; i < paletteEnd; i += 4)
  //{
  // byte[] tempColor = new byte[4];
  // tempColor[0] = (byte)color;
  // tempColor[1] = (byte)color;
  // tempColor[2] = (byte)color;
  // tempColor[3] = (byte)0;
  // color++;

  // curImageStream.Position = i;
  // curImageStream.Write(tempColor, 0, 4);
  //}
  curImageStream.Position = paletteStart;

  //最终生成的位图数据,以及大小,高度没有变,宽度需要调整
  byte[] destImageData = new byte[bitmapDataSize];
  int destWidth = originalWidth + curPadNum;

  //生成最终的位图数据,注意的是,位图数据 从左到右,从下到上,所以需要颠倒
  for (int originalRowIndex = originalHeight - 1; originalRowIndex >= 0; originalRowIndex--)
  {
  int destRowIndex = originalHeight - originalRowIndex - 1;

  for (int dataIndex = 0; dataIndex < originalWidth * 3; dataIndex += 3)
  {
  //同时还要注意,新的位图数据的宽度已经变化destWidth,否则会产生错位
  destImageData[destRowIndex * destWidth + dataIndex] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex];
  destImageData[destRowIndex * destWidth + dataIndex + 1] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex + 1];
  destImageData[destRowIndex * destWidth + dataIndex + 2] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex + 2];
  }
  }


  //将流的Position移到数据段  
  curImageStream.Position = dataOffset;

  //将新位图数据写入内存中
  curImageStream.Write(destImageData, 0, bitmapDataSize);

  curImageStream.Flush();

  //将内存中的位图写入Bitmap对象
  resultBitmap = new Bitmap(curImageStream);



  return resultBitmap;
  }
  catch (System.Exception ex)
  {
  XMLWriter.AddErrorRecord("Collections:CreateBitmap", ex);
  return resultBitmap;
  }

  }


关联这个函数函数
public void SetParameters(IntPtr pbuffData)
  {
  if (pbuffData == null)
  {
  return;
  }
  try
  {
  System.Runtime.InteropServices.Marshal.Copy(pbuffData, bmpData_ori, 0, bmpData_ori.Length);

  Yuv2ToRgb(bmpData_ori, bBmp, m_Width, m_Height);
  bmCam = CreateBitmap(bBmp, m_Width, m_Height);
  bmShow = KiRotate(bmCam, 90, Color.Transparent);
  //if (CheckUserStat())
  //{
  // ClearPic();
  // return;
  //}
  picVido.Image = bmShow;

  // 采集部分
  if (bIsCam && nCamNum < m_MaxCam)
  {
  faceBMPFile = new Bitmap(128, 128, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  faceImage = new Emgu.CV.Image<Gray, Byte>(bmCam);
  smallFaecImage[nCamNum] = new Emgu.CV.Image<Gray, Byte>(faceBMPFile);
  int isFace = HJFace.FaceLocated(faceImage.Ptr, smallFaecImage[nCamNum].Ptr, pfeaturetemp[nCamNum], nCamWay - 1, 0);
  //int isFace = HJFace.FaceLocated(faceImage.Ptr, smallFaecImage[nCamNum].Ptr, pfeaturetemp[nCamNum], nCamWay - 1);

  // 是人脸
  if (isFace == 0)
  {
  faceBMPFile = IplImagePointerToBitmap(smallFaecImage[nCamNum].Ptr);
  ((PictureBox)picFaecArr.GetValue(nCamNum)).Image = faceBMPFile;
  m_imageArr[nCamNum] = bmShow;
  nCamNum++;
  }
  // 暂停采集
  if (nCamNum == 10 && m_MaxCam == 10)
  {
  bIsCam = false;
  //MessageBox.Show("已经采集10张照片,暂停采集", "提示");
   
  m_bImage = false;
  Form1 frm = new Form1();
  frm.ShowDialog();
  frm.Focus();
  if(btnStart.Text == "暂停采集")
  {
  btnStart.Enabled = true;
  btnStart.Text = "继续采集";
  }
  if(btnStartRec.Text == "暂停采集")
  {
  btnStartRec.Enabled = true;
  btnStartRec.Text = "继续采集";
  }
  }
  // 完成采集
  if (nCamNum == 20)
  {
  bIsCam = false;
  m_bImage = true;
  //if (CheckUserStat())
  // return;

  HJSpeakEngine hjse = new HJSpeakEngine();
  hjse.PlayNeoSPEECH("采集完毕");


  //if (CheckUserStat())
  // return;

  //MessageBox.Show("已经采集20张照片,点击人脸照片选择10张模版", "提示");

   
  Form1 frm = new Form1();
  frm.ShowDialog();
  frm.Focus();

  m_bIsCheck = true;
  btnReCam.Enabled = true;
  }
  }
  }
  catch (System.Exception ex)
  {
  XMLWriter.AddErrorRecord("Collections:SetParameters", ex);
  }
   
  }
开始存没问题,后来就会提示内存不足

[解决办法]
既没有Close也没有Dispose,内存占用只会越来越高

热点排行