CImage类的使用问题!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CImage类的使用问题!!相关的知识,希望对你有一定的参考价值。

CImage::Attach();MSDN上说是绑定一张DIB位图!

什么叫绑定?是载入吗?之后便可以对这张DIB位图进行各种操作了吗?

CImage是封装图片的类,让一个CImage和图片发生关系的方式有:
Create, Load, LoadFromResource 和 Attach
第一种是凭空建立一个图片
第二和第三中是从程序外部得到一张图片
而Attach是指,在程序内,已经有一个HBITMAP句柄的情况下,将其与CImage发生关系。

上述任何一种方法执行后,都可以进行图形的各种操作。
参考技术A 其实就是有了联系。以后对 CImage的操作都会操作绑定的实际图像。这就是个概念。

CImage析构函数问题?

我正在使用下面的功能来实时处理图像。使用计时器每10秒调用一次该函数。

问题是我得到断言失败,无法弄清楚确切的问题。我为ImageDC尝试了CImage :: ReleaseDC()和DeleteDC(),但没有运气。

有任何想法吗 ?

LRESULT CAutodetectDialog::AutoscanPatterns(WPARAM, LPARAM)
{
    HWND hwnd = ::FindWindow(NULL, windowTitle);

    if (hwnd != NULL)    
        for (int i=0; i<N_NUMBERS; i++)
        {        
            CImage image;
            image.Create(dbParams.width, dbParams.height, 24);

            CImageDC imageDC(image);
            ::SetWindowOrgEx(imageDC, db.topLeft.x, dbParams.topLeft.y + i * dbParams.height, NULL);
            ::PrintWindow(hwnd, imageDC, PW_CLIENTONLY);

            // Process the image - processing takes < 1 sec
            // and the image parameter is not being changed
            SaveImagePatterns(&image);                
        }            //   <-------------  This line fails , must be the destructor 
                     // of CImage : atlimage.h Line 884,  m_hDC == 0
                     // m_hDC is not NULL in the code

        return 0;
}


// Process the image - processing takes < 1 sec
// and the image parameter is not changed
void CAutodetectDialog::SaveImagePatterns(const CImage* image)
{
.........
}

这是在atlimage.h中失败的代码:

inline HBITMAP CImage::Detach() throw()
{
    HBITMAP hBitmap;

    ATLASSUME( m_hBitmap != NULL );
    ATLASSUME( m_hDC == NULL );             // <------ This guy

    hBitmap = m_hBitmap;
...


...
return( hBitmap );
}

更新:在注释掉函数SaveImagePatterns()之后,断言失败没有发生。因此,问题必须在该函数中,尽管CImage参数作为const传递。

答案

这看起来很可疑:

SaveImagePatterns(&image);

由于image是一个局部变量,取决于SaveImagePatterns对它的作用,这可能会导致问题,因为一旦该块退出,image对象就会被销毁。

另一答案

你在image->GetDC()自己打电话给任何SaveImagePatterns吗?

请注意image->GetDC()需要与image->ReleaseDC()配对。

所以m_hDC将是NULL

以上是关于CImage类的使用问题!!的主要内容,如果未能解决你的问题,请参考以下文章

CImage析构函数问题?

使用(MFC 的)CImage::SetPixel() 改变像素的颜色

CBitmap 和 CImage 可以互换吗?

CImage::Load() 从内存而不使用 CreateStreamOnHGlobal

使用vs2005cimage类显示图片出现问题。求大神指教

使用 ATL CImage 从内存缓冲区加载图像