void CDynSplitView2::OnCanny()
{
// TODO: 在此添加命令处理程序代码
clearmem();
//获得文档类指针
CDSplitDoc *pDoc = (CDSplitDoc *)this->GetDocument();
//获得CDib类指针
CDib *pDib = pDoc->m_pDibInit;
LPBITMAPINFOHEADER lpBMIH = pDib->m_lpBMIH;
CSize sizeImage = pDib->GetDimensions();
int nWidth = sizeImage.cx;
int nHeight = sizeImage.cy;
int nSaveWidth = pDib->GetDibSaveDim().cx;
          ……
}
这是用Canny算子提取图像边缘的部分程序。
请问我该如何来定义m_pDibInit?
定义pDib指针后,如果不初始化,系统不会报错,但是运行后得不到原图像的数据指针(CDib *pDib = pDoc->m_pDibInit;)
我该怎么办,着急~~#ifndef __CDIB_H
#define __CDIB_Hclass CDib : public CObject
{
public:
    RGBQUAD* m_pRGB;
    BYTE* m_pData;
    UINT m_numberOfColors;
BOOL m_valid;
    BITMAPFILEHEADER bitmapFileHeader;    BITMAPINFOHEADER* m_pBitmapInfoHeader;
    BITMAPINFO* m_pBitmapInfo;
int byBitCount;
DWORD dwWidthBytes; LPBYTE m_lpImage; // DIB位图数据块地址
LPBITMAPINFOHEADER m_lpBMIH; // DIB信息头指针
    
public:
    CDib();
    ~CDib(); char m_fileName[256];
    char* GetFileName();
    BOOL IsValid();
    DWORD GetSize();
    UINT GetWidth();
    UINT GetHeight();
    UINT GetNumberOfColors();
    RGBQUAD* GetRGB();
    BYTE* GetData();
    BITMAPINFO* GetInfo();
DWORD GetDibWidthBytes(); WORD PaletteSize(LPBYTE lpDIB);
WORD DIBNumColors(LPBYTE lpDIB);
    void SaveFile(const CString filename);
CSize GetDimensions(); // 获取以象素表示的DIB的宽度和高度
CSize GetDibSaveDim(); // 获取DIB位图数据块的存储尺寸public:
    void LoadFile(const char* dibFileName);

};#endif
以上是我自己构造的CDib类的头文件。在线等待解答

解决方案 »

  1.   

    我这有点代码看看对你有用不,懒的看你代码了,呵呵 HGLOBAL hDIB = pDoc->GetHObject();
    if (hDIB != NULL)     // 判断DIB是否为空
    {
    LPSTR lpDibSection = (LPSTR) ::GlobalLock(hDIB);
    int cxDIB = (int) pDoc->m_dib.GetWidth(lpDibSection); // 获取DIB宽度
    int cyDIB = (int) pDoc->m_dib.GetHeight(lpDibSection); // 获取DIB高度
    ::GlobalUnlock(hDIB);
    CRect rcDIB;
    rcDIB.top = rcDIB.left = 0;
    rcDIB.right = cxDIB;
    rcDIB.bottom = cyDIB;
    CRect rcDest= rcDIB;
    pDoc->m_dib.DrawDib(pDC->m_hDC, &rcDest, pDoc->GetHObject(),// 重画DIB
    &rcDIB, pDoc->GetDocPal());
    }
    else
    {
    pDC->TextOut(30,30,"可以通过文件菜单打开BMP文件,并显示,也可实现存储BMP文件!");
    }
      

  2.   

    一下是我CDib类头文件// Dib.h: interface for the CDib class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)
    #define AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
                                  
    #define PalVersion   0x300                                 // 调色板版本class CDib : public CObject  
    {
    public:
    CDib();
    virtual ~CDib();
    //operations
    public:
    // 用于操作DIB的函数声明
    BOOL   DrawDib(HDC, LPRECT,HGLOBAL, LPRECT,CPalette*);//显示位图
    BOOL   ConstructPalette(HGLOBAL,CPalette* );         //构造逻辑调色板
    LPSTR  GetBits(LPSTR);                               //取得位图数据的入口地址
    DWORD  GetWidth(LPSTR);                              //取得位图的宽度
    DWORD  GetHeight(LPSTR);                             //取得位图的高度
    WORD   GetPalSize(LPSTR);                            //取得调色板的大小
    WORD   GetColorNum(LPSTR);                            //取得位图包含的颜色数目
    WORD   GetBitCount(LPSTR);                            //取得位图的颜色深度
    HGLOBAL CopyObject(HGLOBAL);                         //用于复制位图对象 BOOL   SaveFile(HGLOBAL , CFile&);                    //存储位图为文件
    HGLOBAL   LoadFile(CFile&);                          //从文件中加载位图
    // 在对图象进行处理时,针对位图的字节宽度必须是4的倍数的这一要求,
    // 我们设计了函数GetRequireWidth,来处理这种比较特殊的情况
    int     GetReqByteWidth(int );                     //转换后的字节数GetRequireByteWidth
    long    GetRectWidth(LPCRECT );                    //取得区域的宽度
    long    GetRectHeight(LPCRECT);                    //取得区域的高度
    public:
    void ClearMemory();
    void InitMembers();
    public:
    LPBITMAPINFO        lpbminfo; // 指向BITMAPINFO结构的指针
    LPBITMAPINFOHEADER  lpbmihrd; //指向BITMAPINFOHEADER结构的指针
    BITMAPFILEHEADER bmfHeader;  //BITMAPFILEHEADER结构
    LPSTR lpdib;      //指向DIB的指针
    LPSTR lpDIBBits;  // DIB像素指针
    DWORD dwDIBSize;  //DIB大小 HGLOBAL m_hDib;//DIB对象的句柄

    RGBQUAD* lpRgbQuag;//指向颜色表的指针
    };#endif // !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)
      

  3.   

    m_pDibInit.LoadFile(图像文件名);
      

  4.   


    请问m_pDibInit是CDSplitDoc中的一个什么参数?我该如何来定义它?
    //获得CDib类指针
    CDib *pDib = pDoc->m_pDibInit;像我这么定义和初始化,系统报错,提示m_pDibInit未定义。我该怎么来定义m_pDibInit,让它指向当前打开图像的指针呢?
    如果我只定义pDib指针,然后不初始化,系统不会报错,但是无法获得原图像的数据指针,所以无法对打开的图像进行处理。
      

  5.   

    你得先在你的文档类定义一个CDib对象吧
    CDib m_pDibInit;
    然后你得用这个对象读取文件吧
    m_pDibInit.LoadFile("XXXX");
    然后你才能用吧CDib *pDib = pDoc->m_pDibInit;
      

  6.   


    这么做的话,很明显系统会报错吧。m_pDibInit是CDib类型的,而pDib是CDib类型的指针,赋值时肯定会出错的。