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类的头文件。在线等待解答
{
// 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类的头文件。在线等待解答
解决方案 »
- 小车上电动机转动速度rpm和小车实际的速度m/s之间的转化问题
- VC9 下面如何生成 CPropertySheet ? VC6下都是用向导生成的
- 有人知道fscanf的用法吗?请求一下帮助,本人看了MSDN但还是不太明白
- _beginthreadex和CreateThread的区别
- 如何在工程中加入.rc资源文件?
- 请问SetWindowPos的各个参数是什么含义?
- ?急!寻找一个图标,类似XP中的那个黄色小锁。
- 如何关联FLASH文件到我的程序?
- 大家帮我一个吧。。。。。mdi程序中。当子窗口最大时。如何去掉那三个(恢复。最小。关闭)按扭。急!
- 如何使应用程序中捕获到鼠标点在ActiveX控件上的坐标?
- WORD打印的问题
- 重问地址问题,CFile.Open返回错误:无效地址,在线等......
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文件!");
}
//
//////////////////////////////////////////////////////////////////////#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_)
请问m_pDibInit是CDSplitDoc中的一个什么参数?我该如何来定义它?
//获得CDib类指针
CDib *pDib = pDoc->m_pDibInit;像我这么定义和初始化,系统报错,提示m_pDibInit未定义。我该怎么来定义m_pDibInit,让它指向当前打开图像的指针呢?
如果我只定义pDib指针,然后不初始化,系统不会报错,但是无法获得原图像的数据指针,所以无法对打开的图像进行处理。
CDib m_pDibInit;
然后你得用这个对象读取文件吧
m_pDibInit.LoadFile("XXXX");
然后你才能用吧CDib *pDib = pDoc->m_pDibInit;
这么做的话,很明显系统会报错吧。m_pDibInit是CDib类型的,而pDib是CDib类型的指针,赋值时肯定会出错的。