读书人

memorystream写下内存提示内存不足

发布时间: 2012-10-30 16:13:36 作者: rapoo

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,内存占用只会越来越高

读书人网 >C#

热点推荐