首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

【VC++图像处理】 参考书上的一段程序编译有有关问题 烦请高手指教

2012-03-09 
【VC++图像处理】 参考书上的一段程序编译有问题 烦请高手指教就是参考书上的两段程序 编译的时候遇到些问题

【VC++图像处理】 参考书上的一段程序编译有问题 烦请高手指教
就是参考书上的两段程序 编译的时候遇到些问题 大家复制运行就可以了
麻烦告诉我解决的办法 最好能详细告诉我问题出在哪里 谢谢了!

//======================================================================
// 文件: Dib.h
// 内容: 设备无关位图类-头文件
// 功能: (1)位图的加载与保存;
// (2)位图信息的获取;
// (3)位图数据的获取;
// (3)位图的显示;
// (4)位图的转换;
// (5)位图相关判断;
//======================================================================

#pragma once

#include "afx.h"

class CDib : public CObject
{
public:
  // 构造函数,初始化数据成员
  CDib(void);

  // 析构函数,释放内存空间
  ~CDib(void);

  // 从文件加载位图
  BOOL LoadFromFile(LPCTSTR lpszPath);

  // 将位图保存到文件
  BOOL SaveToFile(LPCTSTR lpszPath);

  // 获取位图文件名
  LPCTSTR GetFileName();

  // 获取位图宽度
  LONG GetWidth();

  // 获取位图高度
  LONG GetHeight();

  // 获取位图的宽度和高度
  CSize GetDimension();  
   
  // 获取位图大小
  DWORD GetSize();

  // 获取单个像素所占位数
  WORD GetBitCount();

  // 获取每行像素所占字节数
  UINT GetLineByte();

  // 获取位图颜色数
  DWORD GetNumOfColor();

  // 获取位图颜色表
  LPRGBQUAD GetRgbQuad();

  // 获取位图数据
  LPBYTE GetData();
   
  // 显示位图
  BOOL Draw(CDC *pDC, CPoint origin, CSize size);

  // 24位彩色位图转8位灰度位图
  BOOL RgbToGrade();

  // 8位灰度位图转24位彩色位图
  BOOL GradeToRgb();

  // 判断是否含有颜色表
  BOOL HasRgbQuad();

  // 判断是否是灰度图
  BOOL IsGrade();

  // 判断位图是否有效
  BOOL IsValid();  

protected:
  // 计算位图颜色表长度
  DWORD CalcRgbQuadLength();

  // 根据颜色表生成调色板
  BOOL MakePalette();

  // 清理空间
  void Empty(BOOL bFlag = TRUE);

private:
  // 位图文件名
  char m_fileName[_MAX_PATH];

  // 位图文件头指针  
  LPBITMAPFILEHEADER m_lpBmpFileHeader; // 需要动态分配和释放 

  // 位图指针(包含除位图文件头的所有内容)
LPBYTE m_lpDib; // 需要动态分配和释放

  // 位图信息指针
  LPBITMAPINFO m_lpBmpInfo;

// 位图信息头指针
LPBITMAPINFOHEADER m_lpBmpInfoHeader;  

  // 位图颜色表指针
LPRGBQUAD m_lpRgbQuad; 

  // 位图数据指针
LPBYTE m_lpData; 

  // 调色板句柄
HPALETTE m_hPalette;

  // 是否有颜色表
  BOOL m_bHasRgbQuad;

  // 位图是否有效
  BOOL m_bValid;
};






//======================================================================
// 文件: Dib.cpp
// 内容: 设备无关位图类-源文件
// 功能: (1)位图的加载与保存;
// (2)位图信息的获取;
// (3)位图数据的获取;
// (3)位图的显示;
// (4)位图的转换;
// (5)位图相关判断;
//======================================================================

#include "StdAfx.h"
#include "Dib.h"

//=======================================================
// 函数功能: 构造函数,初始化数据成员
// 输入参数: 无
// 返回值: 无
//=======================================================
CDib::CDib(void)
{
  // 数据成员初始化
  strcpy(m_fileName, "");
  m_lpBmpFileHeader = NULL;
  m_lpDib = NULL;  
  m_lpBmpInfo = NULL;
  m_lpBmpInfoHeader = NULL;
  m_lpRgbQuad = NULL;
  m_lpData = NULL;
  m_hPalette = NULL;
  m_bHasRgbQuad = FALSE;


  m_bValid = FALSE;
}

//=======================================================
// 函数功能: 析构函数,释放内存空间
// 输入参数: 无
// 返回值: 无
//=======================================================
CDib::~CDib(void)
{
  // 清理空间
  Empty();
}

//=======================================================
// 函数功能: 从文件加载位图
// 输入参数: LPCTSTR lpszPath-待加载位图文件路径
// 返回值: BOOL-TRUE 成功;FALSE 失败
//=======================================================
BOOL CDib::LoadFromFile(LPCTSTR lpszPath)
{
  // 记录位图文件名
  strcpy(m_fileName, lpszPath);

  // 以读模式打开位图文件
  CFile dibFile;
  if(!dibFile.Open(m_fileName, CFile::modeRead | CFile::shareDenyWrite))
  {
  return FALSE;
  }

  // 清理空间
  Empty(FALSE); 
   
  // 为位图文件头分配空间,并初始化为0
  m_lpBmpFileHeader = (LPBITMAPFILEHEADER)new BYTE[sizeof(BITMAPFILEHEADER)];
  memset(m_lpBmpFileHeader, 0, sizeof(BITMAPFILEHEADER)); 

  // 读取位图文件头
  int nCount = dibFile.Read((void *)m_lpBmpFileHeader, sizeof(BITMAPFILEHEADER));
  if(nCount != sizeof(BITMAPFILEHEADER)) 
  {
  return FALSE;
  } 

  // 判断此文件是不是位图文件(“0x4d42”代表“BM”)
  if(m_lpBmpFileHeader->bfType == 0x4d42)
  {
  // 是位图文件

  // 计算除位图文件头的空间大小,分配空间并初始化为0
  DWORD dwDibSize = dibFile.GetLength() - sizeof(BITMAPFILEHEADER);
  m_lpDib = new BYTE[dwDibSize];
  memset(m_lpDib, 0, dwDibSize);

  // 读取除位图文件头的所有数据
  dibFile.Read(m_lpDib, dwDibSize);

  // 关闭位图文件
  dibFile.Close();

  // 设置位图信息指针
  m_lpBmpInfo = (LPBITMAPINFO)m_lpDib;

  // 设置位图信息头指针
  m_lpBmpInfoHeader = (LPBITMAPINFOHEADER)m_lpDib;

  // 设置位图颜色表指针
  m_lpRgbQuad = (LPRGBQUAD)(m_lpDib + m_lpBmpInfoHeader->biSize);

  // 如果位图没有设置位图使用的颜色数,设置它
  if(m_lpBmpInfoHeader->biClrUsed == 0)
  {
  m_lpBmpInfoHeader->biClrUsed = GetNumOfColor();
  }

  // 计算颜色表长度
  DWORD dwRgbQuadLength = CalcRgbQuadLength();

  // 设置位图数据指针
  m_lpData = m_lpDib + m_lpBmpInfoHeader->biSize + dwRgbQuadLength;

  // 判断是否有颜色表
  if(m_lpRgbQuad == (LPRGBQUAD)m_lpData)
  {
  m_lpRgbQuad = NULL; // 将位图颜色表指针置空
  m_bHasRgbQuad = FALSE; // 无颜色表
  }
  else
  {
  m_bHasRgbQuad = TRUE; // 有颜色表
  MakePalette(); // 根据颜色表生成调色板
  }  

  // 设置位图大小(因为很多位图文件都不设置此项)
  m_lpBmpInfoHeader->biSizeImage = GetSize();

  // 位图有效
  m_bValid = TRUE;

  return TRUE;
  }
  else
  {
  // 不是位图文件
  m_bValid = FALSE;

  return FALSE;
  }  

}



[解决办法]
大哥,您这程序太大了,估计没几个人愿意看完呢
还不如再把编译的结果复制上来看看
[解决办法]
提示少分号也不一定就是真少分号, 可能是某类型缺少定义。

提问的时候把有用的东西摆出来,代码是一部分,报错内容也是一部分。大多数的错误,可能看了报错内容就知道你错在哪了。而且,不是每个人都有精力帮你把代码考到编译器里帮你调试的。
------解决方案--------------------


它是缺少StdAfx.h,不是缺少分号啊……
是不是控制台?
若是,在新建工程命名后,不要选"空工程",选"一个简单的应用程序"。
然后添加代码试试,

热点排行
Bad Request.