谁能帮我分析下这段关于克隆函数的代码:
CDib * CDib::Clone()
{
if (m_hDib == NULL)
return NULL; HDIB hDIB = CopyHandle(m_hDib);
if (hDIB == NULL)
return NULL; CDib *pDib = new CDib;
pDib->m_hDib = hDIB;
pDib->BuildPalette();
pDib->BuildBitmap(); return pDib;
}其中HANDLE CopyHandle(HANDLE h)
{
if (h == NULL)
return NULL; DWORD dwLen = ::GlobalSize((HGLOBAL)h);
HANDLE hCopy = ::GlobalAlloc(GHND, dwLen);
if (hCopy == NULL)
return NULL; void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
void* lp = ::GlobalLock((HGLOBAL) h);
::CopyMemory(lpCopy, lp, dwLen);
::GlobalUnlock(hCopy);
::GlobalUnlock(h); return hCopy;
}
我想知道的是,当我使用如下语句:
m_BaseDib=m_pDib->Clone();
m_BaseDib和m_pDib的像素数据是存在相同内存,还是不同内存里呀?我碰到的具体问题如下:
我要在程序里实现图像的缩放、旋转和反白功能
为了实现缩放,我定义了m_BaseDib=m_pDib->Clone();来存放为进行缩放前的原始像素数据。
当我进行反白和旋转处理时也需要m_BaseDib记录住这些处理,于是,我在反白和旋转处理处都对m_BaseDib对象也进行了相应的处理,也就是说,对m_BaseDib和m_pDib都进行相同的处理,旋转处很正常, 旋转处理被记录住了,但是在反白处却没能记录住,一进行缩放,图像就回复到没有进行反白处理时的图像。反白处代码如下:
void Cdicomtest1Doc::OnDicomimageNegative()
{
// TODO: 在此添加命令处理程序代码
m_pDib->Negative();
m_BaseDib->Negative();
NegativeFlag=!NegativeFlag;
OnRepaintAllViews();
}
反白处理和旋转处理有一个区别,旋转处理是生成了新对象,然后附给原先的句柄。而反白处理没有这一步,直接处理的数据。可我不明白到底发生了什么导致反白处理无法被存储在m_BaseDib对象中。
求解惑
CDib * CDib::Clone()
{
if (m_hDib == NULL)
return NULL; HDIB hDIB = CopyHandle(m_hDib);
if (hDIB == NULL)
return NULL; CDib *pDib = new CDib;
pDib->m_hDib = hDIB;
pDib->BuildPalette();
pDib->BuildBitmap(); return pDib;
}其中HANDLE CopyHandle(HANDLE h)
{
if (h == NULL)
return NULL; DWORD dwLen = ::GlobalSize((HGLOBAL)h);
HANDLE hCopy = ::GlobalAlloc(GHND, dwLen);
if (hCopy == NULL)
return NULL; void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
void* lp = ::GlobalLock((HGLOBAL) h);
::CopyMemory(lpCopy, lp, dwLen);
::GlobalUnlock(hCopy);
::GlobalUnlock(h); return hCopy;
}
我想知道的是,当我使用如下语句:
m_BaseDib=m_pDib->Clone();
m_BaseDib和m_pDib的像素数据是存在相同内存,还是不同内存里呀?我碰到的具体问题如下:
我要在程序里实现图像的缩放、旋转和反白功能
为了实现缩放,我定义了m_BaseDib=m_pDib->Clone();来存放为进行缩放前的原始像素数据。
当我进行反白和旋转处理时也需要m_BaseDib记录住这些处理,于是,我在反白和旋转处理处都对m_BaseDib对象也进行了相应的处理,也就是说,对m_BaseDib和m_pDib都进行相同的处理,旋转处很正常, 旋转处理被记录住了,但是在反白处却没能记录住,一进行缩放,图像就回复到没有进行反白处理时的图像。反白处代码如下:
void Cdicomtest1Doc::OnDicomimageNegative()
{
// TODO: 在此添加命令处理程序代码
m_pDib->Negative();
m_BaseDib->Negative();
NegativeFlag=!NegativeFlag;
OnRepaintAllViews();
}
反白处理和旋转处理有一个区别,旋转处理是生成了新对象,然后附给原先的句柄。而反白处理没有这一步,直接处理的数据。可我不明白到底发生了什么导致反白处理无法被存储在m_BaseDib对象中。
求解惑
m_BaseDib=m_pDib->Clone();
m_BaseDib和m_pDib的像素数据是存在相同内存,还是不同内存里呀?
================
不同内存啊,CopyHandle中不是重新分配了么
不过内容是一致的至于你的问题
你可以分解开
把每一步的图像画出来看看就知道了
{
IplImage *src = 0; //源图像指针
IplImage *dst = 0; //目标图像指针
CvSize dst_cvsize; //目标图像尺寸 src=m_BaseDib->Dib2Ipl();
dst_cvsize.width =ScaleNowWidth * dRatio; //目标图像的宽为源图象宽的scale倍
dst_cvsize.height =ScaleNowHeight * dRatio; //目标图像的高为源图象高的scale倍
dst = cvCreateImage( dst_cvsize, src->depth, src->nChannels); //构造目标图象
cvResize(src, dst, CV_INTER_LINEAR); //缩放源图像到目标图像 HDIB m_newDib=Ipl2Dib(dst);
cvReleaseImage(&src); //释放源图像占用的内存
cvReleaseImage(&dst); //释放目标图像占用的内存 return m_newDib;}//将DIB位图转换为IplImage类型
IplImage* CDib::Dib2Ipl()
{
LPBITMAPINFO lpbmi=NULL;
//lpbmi=(LPBITMAPINFOHEADER)m_hDib;
lpbmi=(LPBITMAPINFO)GlobalLock(m_hDib); bool isLowerLeft = lpbmi->bmiHeader.biHeight<0;
int height = (lpbmi->bmiHeader.biHeight>0) ? lpbmi->bmiHeader.biHeight : -lpbmi->bmiHeader.biHeight;
IplImage* iplImg = cvCreateImage( cvSize(lpbmi->bmiHeader.biWidth, height), IPL_DEPTH_8U, lpbmi->bmiHeader.biBitCount / 8);
CopyData( iplImg->imageData,(char *)FindDIBBits((LPBYTE)lpbmi), lpbmi->bmiHeader.biSizeImage,isLowerLeft, height);
GlobalUnlock(m_hDib);
return iplImg;
}
既然你用OpenCV应该有很方便的途径把文件保存的文件
把每个步骤产生的阶段性文件有不同的名字存盘
然后就可以比较一下分析问题了
我在反白处理后输出了图像,发现,命名在图像上可以看到已经反白的图像,但是保存出来的bmp文件却是没有反白的。我的反白处理代码是抄来的,如下://反白
BOOL CDib::Negative()
{
if (! NegativeDIB(m_hDib))
return FALSE;
return UpdateInternal();
}/*************************************************************************
* NegativeDIB()
*
* Parameters:
* HDIB hDIB - handle to global memory with a DIB spec
* in it followed by the DIB bits
* Return Value:
* BOOL - TRUE is success, else FALSE
* Description:
* Negative DIB
************************************************************************/
BOOL NegativeDIB(HDIB hDib)
{
if (hDib == NULL)
return FALSE;
BITMAPINFO *bmi = (BITMAPINFO *)GlobalLock(hDib);
if (! bmi)
return FALSE; WaitCursorBegin(); // get color number
WORD wNumColors = DIBNumColors((LPBYTE)bmi); if (wNumColors) // There is palette
{
for (WORD i=0; i<wNumColors; i++)
{
Negative(&(bmi->bmiColors[i].rgbRed),
&(bmi->bmiColors[i].rgbGreen),
&(bmi->bmiColors[i].rgbBlue));
}
}
else // No palette
{
// bits position
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)bmi;
LPBYTE lpBits = (LPBYTE)lpbi + lpbi->biSize;
int nDelta = WIDTHBYTES(lpbi->biBitCount*lpbi->biWidth) - lpbi->biWidth*lpbi->biBitCount/8;
BYTE r, g, b;
for (int ny=0; ny<lpbi->biHeight; ny++)
{
for (int nx=0; nx<lpbi->biWidth; nx++)
{
b = (BYTE)*(lpBits);
g = (BYTE)*(lpBits+1);
r = (BYTE)*(lpBits+2);
Negative(&r, &g, &b);
*lpBits++ = b;
*lpBits++ = g;
*lpBits++ = r;
}
lpBits += nDelta;
}
} GlobalUnlock(hDib);
WaitCursorEnd();
return TRUE;
}[code=C/C++]
void Negative(BYTE *r, BYTE *g, BYTE *b)
{
*r = 255 - *r;
*g = 255 - *g;
*b = 255 - *b;
}[/code]
你怎么看到的
刚刚所说的情况是:我采用的是周长发《精通VC图像处理编程》里给的反白处理代码,在运行程序时,在窗口里看到图像是进行了反白处理的,但是保存出来的文件却是没哟反白的,不解
太感谢你教给我的调试方法啦^_^
/KISS