用我仅剩的分数发出令我吐血的帖子,望高手可怜一下,指点迷津!拜托了
不想看程序,看看我的注释和问题,请给点建议!!!
程序不是我写的,我读起来有点费劲,但是大概意思还是能看明白
我就是加了个参数改动了一下
BOOL SpinFilterDIB(HDIB hDIB,CArray4b* pArray4b/*=NULL*/)
{
ASSERT(hDIB!=NULL);
unsigned* peArray = NULL;
if(pArray4b) peArray = new unsigned;
// start wait cursor
WaitCursorBegin();
HDIB hDib = NULL;
HDIB hNewDib = NULL;
// we only convolute 24bpp DIB, so first convert DIB to 24bpp
WORD wBitCount = DIBBitCount(hDIB);
if (wBitCount != 24)
{
hNewDib = ConvertDIBFormat(hDIB, 24, NULL);
hDib = CopyHandle(hNewDib);
}
else
{
hNewDib = CopyHandle(hDIB);
hDib = CopyHandle(hDIB);
}
// process!
LPBYTE lpSrcDIB = (LPBYTE)GlobalLock(hDib);
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
LPBYTE lpInput = FindDIBBits(lpSrcDIB);
LPBYTE lpOutput = FindDIBBits(lpDIB);
int nWidth = DIBWidth(lpSrcDIB);
int nHeight = DIBHeight(lpSrcDIB);
BYTE *lpPoints=new BYTE[nWidth*nHeight];
ASSERT(lpPoints!=NULL);
//将图象数据取出为矩阵
GetPoints(nWidth,nHeight,lpInput,lpPoints,MEAN_TYPE);
int i,j;
//
//算法实现部分,就是处理矩阵lpPoints
//
delete peArray;
//将数据矩阵放到图象中
PutPoints(nWidth,nHeight,lpOutput,lpPoints);
delete lpPoints;
lpPoints = NULL;
// recover
DWORD dwSize = GlobalSize(hDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
if (wBitCount != 24)
{
//?我很奇怪这,hNewDib指向还是有空间的,在没有释放的情况下赋值,旧的空间怎么办?是不是我看错了?
//是不是应该先释放?
hNewDib = ConvertDIBFormat(hDib, wBitCount, NULL);
lpSrcDIB = (LPBYTE)GlobalLock(hDIB);
lpDIB = (LPBYTE)GlobalLock(hNewDib);
dwSize = GlobalSize(hNewDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDIB);
GlobalUnlock(hNewDib);
}
else
{
lpSrcDIB = (LPBYTE)GlobalLock(hDIB);
lpDIB = (LPBYTE)GlobalLock(hDib);
dwSize = GlobalSize(hDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDIB);
GlobalUnlock(hDib);
}
// cleanup
GlobalFree(hDib);
GlobalFree(hNewDib);
// return
WaitCursorEnd();
return TRUE;
}
我是这么使用它的
BOOL CDibPro::SpinFilter(CArray4b* pArray4b /*=NULL*/)
{
if (IsEmpty())
return FALSE;
//####m_hDib是类内的图象句柄,delete其实主要是释放它
if (!SpinFilterDIB(m_hDib,pArray4b))
return FALSE;
//return
return UpdateInternal();
}
我就很郁闷了,调用这个成员函数之前还可以delete对象(我用断点试了),调用之后就delete就出错!!!!!!!!!!!!!!!
我不知道这个函数那出问题了,郁闷,真是看不出来才问的?