谁能帮我分析下这段关于克隆函数的代码:
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对象中。
求解惑

解决方案 »

  1.   

    我想知道的是,当我使用如下语句:
    m_BaseDib=m_pDib->Clone();
    m_BaseDib和m_pDib的像素数据是存在相同内存,还是不同内存里呀?
    ================
    不同内存啊,CopyHandle中不是重新分配了么
    不过内容是一致的至于你的问题
    你可以分解开
    把每一步的图像画出来看看就知道了
      

  2.   

    补充一点,我的缩放处理是用的OpenCV的cvResize,中间涉及了Dib到IplImage的转换,代码如下:HDIB CDib::CVChangeDIBSize(CDib * m_BaseDib,double dRatio)
    {
    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;
    }
      

  3.   

    不要设断点
    既然你用OpenCV应该有很方便的途径把文件保存的文件
    把每个步骤产生的阶段性文件有不同的名字存盘
    然后就可以比较一下分析问题了
      

  4.   

    郁闷哦,我用了上述方法对图像进行了保持,发觉问题也许出在反白处理的函数里
    我在反白处理后输出了图像,发现,命名在图像上可以看到已经反白的图像,但是保存出来的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]
      

  5.   

    什么叫“明明在图像上可以看到已经反白的图像,但是保存出来的bmp文件却是没有反白的”
    你怎么看到的
      

  6.   

    我尝试在OpenCV中进行反白处理,一切顺利,并且能够保存到对象中。
    刚刚所说的情况是:我采用的是周长发《精通VC图像处理编程》里给的反白处理代码,在运行程序时,在窗口里看到图像是进行了反白处理的,但是保存出来的文件却是没哟反白的,不解
      

  7.   

    是哦,真是愣看,呵呵,不过问题解决了还是很开心呀
    太感谢你教给我的调试方法啦^_^
    /KISS